android - PagerAdapter 内的 RecyclerView 不更新内容

标签 android onclick android-recyclerview notifydatasetchanged

我已经搜索并尝试了很多方法来让它工作,但我就是无法让它工作......

我有一个 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/

相关文章:

android - 从未调用 AsyncTask onPostExecute() + W/art : Suspending all threads took: 1. 1ms

javascript - 如何停止 JavaScript 定时器?

android - RecyclerView smoothScroolToPositionFromTop()

javascript - 使用 JavaScript 激活 td 按钮

android - 在 Cursor 支持的 RecyclerView 中隐藏(并重新显示)卡片

android - 具有动态项目高度的水平 RecyclerView

android - 尝试使用 Twitter 登录 Firebase 时出现 NullPointerException

android - 无法在我的应用程序中集成缩放

java - 将对象数组发送到 WebService

javascript - 类元素的单击显示不起作用