Java 这个片段视图模型应该放什么?
我想问一下fragment和viewmodel。我正在制作一个gridView,可以通过改装(导航抽屉)显示图像。使用mainActivity时没有问题,但使用片段时会出现如下错误Java 这个片段视图模型应该放什么?,java,android,android-fragments,model-view-controller,Java,Android,Android Fragments,Model View Controller,我想问一下fragment和viewmodel。我正在制作一个gridView,可以通过改装(导航抽屉)显示图像。使用mainActivity时没有问题,但使用片段时会出现如下错误 public class InfografisFragment extends Fragment { private InfografisViewModel infografisViewModel; private List<Spacecraft> spacecraftList; private Gr
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;
}
}
以及调试的其余部分
以及API PHP文件
我一直在反复尝试,在谷歌上搜索,但我还是不明白。我应该怎么做?尝试在getItem()中传递null,在getItemId()中传递0
按以下方式更改GridViewAdapter中的代码:
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
以上应该可以解决你的问题。
另外,在onViewCreated方法上,为什么要使用getView()?当视图已在构造函数中作为视图调用时。
您可以使用
gridView=view.findviewbyd(R.id.grid\u视图)代码>取而代之。我想这是一种更好的编码方式。我找到了一个解决方案,将布局从相对更改为cardview,并在build.gradle中添加compabilityOption
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
您是否也可以发布您存储在航天器列表
中的云响应?@Kushal错误非常简单,您正在尝试访问列表中的位置6,该列表在位置5之前只包含元素。调试您的代码并找出位置。另外,你发布的staketrace是有限的,它没有告诉我们错误在哪里occurring@Ricardo这是debug@chrisrobet的其余部分:您能发布gsonvertrofactory
类吗?我怀疑有什么问题,我们无法在getItem()
中传递null
。当用户向下滚动时,将调用此方法,并根据getItem()
的返回值添加新行
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}