Вложенный переработчик вид внутри адаптера
Я занимаюсь разработкой приложения для Android, в котором я использовал вложенный RecyclerView, но я не достигаю того, чего хочу. Я хочу добиться, чтобы в этом списке отображалось название, а под несколькими изображениями, например, ниже, как json, как я могу добиться того, что я использую два видоискателя и это должно scrool также. структура JSON
ниже класс адаптера открытый класс UranAdapter расширяет RecyclerView.Adapter {
public List<Exhibit> exhibitList;
public Context context;
public UranAdapter(List<Exhibit> uranList, Context context) {
this.exhibitList = uranList;
this.context = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView;
switch (viewType) {
case Exhibit.TEXT_TYPE:
itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.exhibit_list, parent, false);
return new ViewHolder(itemView);
case Exhibit.IMAGE_TYPE:
itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.exhibit_list2, parent, false);
return new ImageViewHolder(itemView);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
}
@Override
public int getItemViewType(int position) {
return exhibitList.get(position).type;
}
public int getItemCount() {
return exhibitList.size();
}
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Exhibit exhibit = exhibitList.get(position);
switch (exhibit.type) {
case Exhibit.TEXT_TYPE:
((ViewHolder) holder).exhibition_textView.setText(exhibit.getTitle());
break;
case Exhibit.IMAGE_TYPE:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
((ViewHolder) holder).exhibition_imageView.setImageResource(exhibit.image);
}
break;
}
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView exhibition_imageView;
TextView exhibition_textView;
public ViewHolder(View view) {
super(view);
exhibition_textView = (TextView) view.findViewById(R.id.exhibition_textview);
}
}
public static class ImageViewHolder extends RecyclerView.ViewHolder {
public ImageView exhibition_imageView;
TextView exhibition_textView;
public ImageViewHolder(View view) {
super(view);
exhibition_imageView = (ImageView) view.findViewById(R.id.exhibition_imageview);
}
}
}
ниже MainActivity
открытый класс MainActivity расширяет AppCompatActivity {
public List<Exhibit> exhibitList = new ArrayList<>();
Context context;
RecyclerView recyclerView;
public UranAdapter uranAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ApiInterface apiInterface = ApiClient.getApiService();
Call<ExhibitsLoader> call = apiInterface.getExhibitList();
call.enqueue(new Callback<ExhibitsLoader>() {
@Override
public void onResponse(Call<ExhibitsLoader> call, Response<ExhibitsLoader> response) {
exhibitList = response.body().getExhibitList();
exhibitList.add(new Exhibit(Exhibit.IMAGE_TYPE));
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
uranAdapter = new UranAdapter(exhibitList, context); // changes
recyclerView.setAdapter(uranAdapter);
}
@Override
public void onFailure(Call<ExhibitsLoader> call, Throwable t) {
}
});
}
}
4 ответа
Я думаю, что вам нужно здесь flatMap
встроенный список изображений в одноуровневый список, и вы собираетесь правильно иметь два ViewHolder
разных типов, один для заголовка, а другой для изображения. Не понимаю, почему ваш ViewHolder
s являются статическими.
Вы забыли позвонить notifyDatasetChanged()
после настройки адаптера.
uranAdapter = new UranAdapter(exhibitList, context); // changes
recyclerView.setAdapter(uranAdapter);
uranAdapter.notifyDatasetChanged();
Почему бы вам не использовать два RecyclerViews, один внутри другого?
Один RecyclerView будет иметь заголовок и дочерний RecyclerView. Второй RecyclerView(дочерний RecyclerView) будет иметь только изображения.
Проверьте это сообщение: Recyclerview внутри Recyclerview, получите позицию щелчка дочерней строки внутри родительского адаптера
Используйте расширяемый CardView для этого.. Как: https://www.youtube.com/watch?v=z9qScBaKfnM&t=727s