RecyclerView更新数据方法 notifyItemChanged()、notifyItemInsert()、notifyIteRemoved()等

本文详细介绍了在Android开发中如何使用RecyclerView的notify系列方法来高效更新数据,包括notifyItemChanged()用于更新单个item,notifyItemInserted()插入数据,notifyItemRemoved()删除数据,notifyItemRangeRemoved()和notifyItemRangeInserted()批量操作。这些方法能避免直接调用setAdapter()带来的性能问题和内存泄漏,确保应用在实际开发中的高效稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

初学者在学习RecyclerView这个控件后,会不自觉地使用setAdapter()来更新数据。在初学或教学过程中该方式或许没有问题。然而在实际开发或较高更新性能状态下该方式是不可取的,可能会造成OOMNo Adapter/Skip Layout等问题。与Java中线程资源更新方式类型,RecyclerView数据的更新同样使用notify()家族进行更新。本文将快速帮助初学者使用正确方式进行更新数据源。

一:notifyItemChanged()

该方法使用类是适配器,作用是更新某个item子项的数据。需要说明的是,该更新方式不仅可以更新文字,图片等资源也是可以的。示例方法如下:

private void itemNotifyItemChanged(){
    Bean bean = beanList.get(2);
    bean.setImageViewId(R.drawable.app);
    beanAdapter.notifyItemChanged(2);
}

说明:itemNotifyItemChanged()这个方法是我们自己写的。在该方法里面,首先通过RecyclerView的数据源(某个List集合或其它泛型集合)的获得具体下标索引的Bean对象。然后更新该Bean的图片资源,最后通过适配器的notifyItemChanged()更新下标为2的第三项item子项。那么当我们想要更新时,只需要调用我们写的该方法即可。

二:notifyItemInsert()

该方法使用类是适配器,作用是插入RecyclerView的具体索引位置的item数据(就是在第几项插入数据)。

private void itemNotifyItemInsert(){
    Bean bean = new Bean(R.drawable.app,"App");
    beanList.add(2, bean);
    beanAdapter.notifyItemInserted(2);
}

说明:itemNotifyItemInsert()仍然是我们自己写的(目的是为了减少耦合)。在该方法里面,首先创建一个Bean对象并把基本数据存入。然后使用泛型集合插入具体索引位置的数据,最后通过notifyItemInserted()在第三项后插入一个item数据。

三:notifyItemRemoved()

该方法使用类是适配器,作用是删除RecyclerView的具体索引位置的item数据(就是在第几项删除数据)。

private void itemNotifyItemRemoved(){
    beanList.remove(1);
    beanAdapter.notifyItemRemoved(1);
}

说明:首先先移除我们数据源具体索引位置的数据,这里移除的是第二项,然后调用notifyItemRemoved()方法也移除第二项的item子项。

四:notifyItemRangeRemoved()

该方法使用类是适配器,作用是删除RecyclerView的具体索引位置到指定长度的item数据(就是在第几项删除数据一直删除多少个为止)。

private void itemNotifyItemRangeRemoved(){
    beanList.remove(2);
    beanList.remove(2);
    beanAdapter.notifyItemRangeRemoved(2,2);

}

说明:这里先删除数据源从第三项开始长度为2的数据(就是删除第三项、第四项),然后调用notifyItemRangeRemoved()方法删除指定索引位置指定长度的数据。第一参数为要删除的数据索引位置,第二个是要删除的长度。

五:notifyItemRangeInserted()

该方法使用类是适配器,作用是插入RecyclerView的具体索引位置到指定长度的item数据(就是在第几项插入数据一直插入多少个为止)。

private void itemNotifyItemInsertRange(){
    List<Bean> addBeanList = new ArrayList<Bean>();
    addBeanList.add(new Bean(R.drawable.app, "Google"));
    addBeanList.add(new Bean(R.drawable.app, "Google"));
    addBeanList.add(new Bean(R.drawable.app, "Google"));
    addBeanList.add(new Bean(R.drawable.app, "Google"));
    addBeanList.add(new Bean(R.drawable.app, "Google"));
    beanList.addAll(2, addBeanList);
    beanAdapter.notifyItemRangeInserted(2,5);

}

说明:这里我们先创建一个数据源,然后添加数据。接着调用泛型集合的addAll()方法,将待插入的数据源插入,最后调用notifyItemRangeInserted()插入完成,该方法第一个参数为要插入的位置开始,第二个待插入的长度。

如果读者对全局代码有所疑惑,请看下面:

public class MainActivity extends AppCompatActivity {

    private Button buttonUpdate;
    private RecyclerView recyclerView;
    private BeanAdapter beanAdapter;
    private List<Bean> beanList = new ArrayList<Bean>();

    private void initData(){
        beanList.add(new Bean(R.drawable.apple, "Apple"));
        beanList.add(new Bean(R.drawable.music, "Apple"));
        beanList.add(new Bean(R.drawable.apple, "Apple"));
        beanList.add(new Bean(R.drawable.music, "Apple"));
        beanList.add(new Bean(R.drawable.apple, "Apple"));
        beanList.add(new Bean(R.drawable.music, "Apple"));
        beanList.add(new Bean(R.drawable.apple, "Apple"));
        beanList.add(new Bean(R.drawable.music, "Apple"));
        beanList.add(new Bean(R.drawable.apple, "Apple"));
        beanList.add(new Bean(R.drawable.music, "Apple"));
        beanList.add(new Bean(R.drawable.apple, "Apple"));
        beanList.add(new Bean(R.drawable.music, "Apple"));
        beanList.add(new Bean(R.drawable.apple, "Apple"));
        beanList.add(new Bean(R.drawable.music, "Apple"));
        beanList.add(new Bean(R.drawable.apple, "Apple"));
        beanList.add(new Bean(R.drawable.music, "Apple"));

    }

    private void initRecyclerView(Context context){
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        initData();
        beanAdapter = new BeanAdapter(beanList, context);
        recyclerView.setAdapter(beanAdapter);
    }

    private void initView(){
        buttonUpdate = (Button) findViewById(R.id.button_update);
    }

    private void itemNotifyItemChanged(){
        Bean bean = beanList.get(2);
        bean.setImageViewId(R.drawable.app);
        beanAdapter.notifyItemChanged(2);
    }

    private void itemNotifyItemInsert(){
        Bean bean = new Bean(R.drawable.app,"App");
        beanList.add(2, bean);
        beanAdapter.notifyItemInserted(2);
    }

    private void itemNotifyItemRemoved(){
        beanList.remove(1);
        beanAdapter.notifyItemRemoved(1);
    }

    private void itemNotifyItemInsertRange(){
        List<Bean> addBeanList = new ArrayList<Bean>();
        addBeanList.add(new Bean(R.drawable.app, "Google"));
        addBeanList.add(new Bean(R.drawable.app, "Google"));
        addBeanList.add(new Bean(R.drawable.app, "Google"));
        addBeanList.add(new Bean(R.drawable.app, "Google"));
        addBeanList.add(new Bean(R.drawable.app, "Google"));
        beanList.addAll(2, addBeanList);
        beanAdapter.notifyItemRangeInserted(2,4);

    }

    private void itemNotifyItemRangeRemoved(){
        beanList.remove(2);
        beanList.remove(2);
        beanAdapter.notifyItemRangeRemoved(2,2);

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        initRecyclerView(MainActivity.this);

        buttonUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            itemNotifyItemRemoved();
            }
        });

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值