java - 应该将什么放入该 fragment View 模型中?

标签 java android android-fragments model-view-controller

我想问一下关于fragment和viewmodel的问题。我正在制作一个 gridView ,可以通过改造(抽屉导航)显示图像。使用mainActivity时,没有问题,但是使用fragment时,出现如下错误。

public class InfografisFragment extends Fragment {

private InfografisViewModel infografisViewModel;
private List<Spacecraft> spacecraftList;

private GridViewAdapter adapter;
private GridView gridView;

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    infografisViewModel = ViewModelProviders.of(this).get(InfografisViewModel.class);
    View root = inflater.inflate(R.layout.fragment_infografis, container, false);

    return root;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    MyAPIService myAPIService = RetrofitClientInstance.getRetrofitInstance().create(MyAPIService.class);
    gridView = getView().findViewById(R.id.grid_view);

    Call<List<Spacecraft>> call = myAPIService.getSpacecrafts();
    call.enqueue(new Callback<List<Spacecraft>>() {

        @Override
        public void onResponse(Call<List<Spacecraft>> call, Response<List<Spacecraft>> response) {
            spacecraftList = response.body();
            adapter = new GridViewAdapter(getContext(), spacecraftList);
            gridView.setAdapter(adapter);
        }
        @Override
        public void onFailure(Call<List<Spacecraft>> call, Throwable throwable) {
            Toast.makeText(getContext(), throwable.getMessage(), Toast.LENGTH_LONG).show();
        }
    });
}

class Spacecraft {
    /*
    INSTANCE FIELDS
     */
    @SerializedName("gambar_info")
    private String gambar_info;

    public Spacecraft(int id_info, String gambar_info) {
        this.gambar_info = gambar_info;
    }

    /*
     *GETTERS AND SETTERS
     */

    public String getImageURL() {
        return gambar_info;
    }
}

interface MyAPIService {

    @GET("connection_image_bps.php")
    Call<List<Spacecraft>> getSpacecrafts();
}

static class RetrofitClientInstance {

    private static Retrofit retrofit;
    private static final String BASE_URL = "https://bpskotayogyakarta.000webhostapp.com/";

    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

class GridViewAdapter extends BaseAdapter {

    private List<Spacecraft> spacecrafts;
    private Context context;

    public GridViewAdapter(Context context,List<Spacecraft> spacecrafts){
        this.context = context;
        this.spacecrafts = spacecrafts;
    }

    @Override
    public int getCount() {
        return spacecrafts.size();
    }

    @Override
    public Object getItem(int pos) {
        return spacecrafts.get(pos);
    }

    @Override
    public long getItemId(int pos) {
        return pos;
    }

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        if(view==null)
        {
            view=LayoutInflater.from(context).inflate(R.layout.list_gambar_info,viewGroup,false);
        }

        ImageView spacecraftImageView = view.findViewById(R.id.image_view);

        final Spacecraft thisSpacecraft= spacecrafts.get(position);

        if(thisSpacecraft.getImageURL() != null && thisSpacecraft.getImageURL().length()>0)
        {
            Picasso.get().load(thisSpacecraft.getImageURL()).placeholder(R.drawable.placeholder).into(spacecraftImageView);
        }else {
            Toast.makeText(context, "Empty Image URL", Toast.LENGTH_LONG).show();
            Picasso.get().load(R.drawable.placeholder).into(spacecraftImageView);
        }

        return view;
    }
}

当我尝试运行并打开该 fragment 时,会导致崩溃和错误

2020-01-02 15:26:12.401 2455-2455/com.example.bpskotayogyakarta A/zygote: thread.cc:2090] No pending exception expected: java.lang.ArrayIndexOutOfBoundsException: length=6; index=6
2020-01-02 15:26:12.491 2455-2455/com.example.bpskotayogyakarta A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 2455 (skotayogyakarta), pid 2455 (skotayogyakarta)

其余的调试 https://justpaste.it/2rv1v

以及 API PHP 文件 https://justpaste.it/4pdp8

我试了一遍又一遍,在谷歌上搜索,但我还是不明白。我该怎么办?

最佳答案

我通过更改相对于cardview的布局并在build.gradle中添加compatibilityOption找到了解决方案。

compileOptions{
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

关于java - 应该将什么放入该 fragment View 模型中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59560706/

相关文章:

java - 如何使用 Java 以编程方式检查 ubuntu 上是否安装了软件实用程序

java - 使用Facebook SDK 4在Android中加载Facebook个人资料图片时获取异常

css - Android WebView 边界半径别名

android - 具有主/详细流程的 fragment 中的可扩展 ListView

Android Phonegap 和 fragment

java - Java 中按原语或装箱类进行 foreach 循环

java - Web应用程序[/payapplication]抛出load()异常java.lang.ClassNotFoundException : org. jvnet.hk2.external.runtime.ServiceLocatorRuntimeBean

java - 在方法中使用 'var' 是否会使执行(并发)线程不安全?

android - 可扩展 ListView android json

android - 部 fragment 段项目隐藏在操作栏下