我已经搜索并尝试了很多方法来让它工作,但我就是无法让它工作......
我有一个 PagerAdapter
fragment 。每个页面都有一个带有 View 列表的RecyclerView
。
当我单击 RecyclerView
中的一项时,应显示/隐藏 ImageView
(将显示一个星号 - 收藏夹)。
一切正常,但仅当我单击其中一项时,离开该 fragment ,然后再次输入 PagerAdapter
fragment 。
这是我的PagerAdapter
代码:
private ArrayList<List<String[]>> schedule;
private Context context;
private LayoutInflater layoutInflater;
private RecyclerView recyclerView;
private ArtistAdapter adapter;
//Fill schedule with information in constructor
...
@Override
public Object instantiateItem(ViewGroup container, final int position) {
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View item_view = layoutInflater.inflate(R.layout.schema_page, container, false);
adapter = new ArtistAdapter(context, getData(backgrounds, schedule.get(position)));
recyclerView = (RecyclerView) item_view.findViewById(R.id.artist_list);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerView.setAdapter(adapter);
recyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(context, recyclerView ,new RecyclerItemClickListener.OnItemClickListener() {
@Override public void onItemClick(View view, int itemPosition) {
toggleFavorite(itemPosition, position);
}
})
);
container.addView(item_view);
return item_view;
}
private void toggleFavorite(int itemPosition, int day){
String[] artist = schedule.get(day).get(itemPosition);
if (artist[5].equals("false")){
artist[5] = "true";
} else {
artist[5] = "false"; //Yes, I need it this way.
}
adapter.swap(getData(backgrounds, schedule.get(day), star));
//Do other things that have to be done in the PagerAdapter
}
我的适配器代码:
class ArtistAdapter extends RecyclerView.Adapter<ArtistAdapter.ArtistViewHolder>{
private LayoutInflater inflater;
private List<ArtistRow> data = Collections.emptyList();
ArtistAdapter (Context context, List<ArtistRow> data){
inflater = LayoutInflater.from(context);
this.data = data;
}
@Override
public ArtistViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.artist_row, parent, false);
return new ArtistViewHolder(view);
}
@Override
public void onBindViewHolder(ArtistViewHolder holder, int position) {
ArtistRow current = data.get(position);
holder.name.setText(current.name.toUpperCase());
holder.type.setText(current.type.toUpperCase());
holder.time.setText(current.time.toUpperCase());
holder.place.setText(current.place.toUpperCase());
holder.background.setImageBitmap(current.background);
holder.star.setImageBitmap(current.star);
if (current.starShow.equals("true")){
holder.star.setVisibility(View.VISIBLE);
} else {
holder.star.setVisibility(View.INVISIBLE);
}
}
public void swap(List<ArtistRow> artists){
data.clear();
data.addAll(artists);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return data.size();
}
class ArtistViewHolder extends RecyclerView.ViewHolder {
ImageView background;
ImageView star;
TextView name;
TextView type;
TextView time;
TextView place;
ArtistViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.artist_name);
type = (TextView) itemView.findViewById(R.id.artist_type);
time = (TextView) itemView.findViewById(R.id.artist_time);
place = (TextView) itemView.findViewById(R.id.artist_place);
background= (ImageView) itemView.findViewById(R.id.artist_bg);
star = (ImageView) itemView.findViewById(R.id.star);
}
}
}
我认为适配器有问题。
预加载第二个页面时,会再次调用 instantiateItem
。因此,我用第一页的内容交换第二页,而不是替换第一页,因为它交换了最后一个实例化的项目。
当我单击第一页上的某个项目然后滑动到下一个项目时,下一个项目是第一页的副本(但我单击的项目上有一个星号,这就是我希望第一页的方式就像)并且不显示第二页。
因此,如果我滚动页面并且最后一个 instantiateItem
页面就是我当前正在查看的页面,则交换工作正常。
无论如何,我该如何解决这个问题?
提前致谢!
最佳答案
你可以尝试:
recyclerview.setAdapter(adapter);
recyclerview.scrollToPosition(position);
或者像这样在适配器中创建方法
public void setData(ArrayList<Quote> arrayList) {
this.arrayList.clear();
this.arrayList.addAll(arrayList);
notifyDataSetChanged();
}
并在您的 Activity fragment 中使用
适配器.setData(arraylist)
关于android - PagerAdapter 内的 RecyclerView 不更新内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40776041/