美文网首页Android开发Android技术知识
关于listView、gridView的item的局部刷新

关于listView、gridView的item的局部刷新

作者: 安卓搬砖小曾 | 来源:发表于2019-05-12 12:56 被阅读21次

    前一段时间,公司的业务需求,需要对产品的购买进度要做出局部刷新,就在网上查找到一些资料,并自己写了一个demo试了试,效果不错。

    listView和gridView刷新界面的方法大家普遍知道就是adapter.notifyDataSetChanged()进行界面刷新。但是如果每次都要讲整个数据刷新一遍会耗费很多的内存,局部刷新就避免了这一点。

    主要原理:

    对listview的某一个item进行刷新

    1.要获取要刷新的item当前索引position和数据

    2.对获取的数据进行重置

    3.将重置的数据放到adapter中的数据集的原来的位置(根据position刷新原数据集的某一条数据)

    4.在listview中获取需要刷新的子item的view

    5.从更新过的数据集中获取新数据,更新viwe中的数据(handler中操作,实现界面的刷新)

    功能如下,代码中有详细注释:

    (1).Activity

    public class MainActivity extends Activity {
        private ArrayList<MyListItem> list = null;
        private ListView lv;
        private MyListAdapter adapter1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initData();
            lv = (ListView) findViewById(R.id.listView1);
            adapter1 = new MyListAdapter(list, getApplicationContext());
            adapter1.setListView(lv);
            lv.setAdapter(adapter1);
            lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    // 获取listview中点击item的数据
                    MyListItem item = (MyListItem) parent.getItemAtPosition(position);
                    Log.i("eee", item.getData() + " == " + item.getPosition());
                    // 更新数据
                    item.setData("update item " + position);
                    // 更新界面
                    adapter1.updateItemData(item);
                }
            });
        }
    
        private void initData() {
            list = new ArrayList<MyListItem>();
            for (int i = 0; i < 20; i++) {
                MyListItem item = new MyListItem();
                item.setData("item " + i);
                item.setPosition(i);
                list.add(item);
            }
        }
    
        /**
         * 自定义item数据类型
         */
        class MyListItem {
            /**
             * 数据id
             */
            private int dataId;
            /**
             * 数据
             */
            private String data;
    
            public int getPosition() {
                return dataId;
            }
    
            public void setPosition(int position) {
                this.dataId = position;
            }
    
            public String getData() {
                return data;
            }
    
            public void setData(String data) {
                this.data = data;
            }
    
        }
    }
    
    

    (2).自定义adapter,activity调用其方法

    public class MyListAdapter extends BaseAdapter {
        private Context context;
        private ArrayList<MainActivity.MyListItem> dataListView;
        private ListView listView2;
    
        public MyListAdapter(ArrayList<MainActivity.MyListItem> list, Context applicationContext) {
            this.context = applicationContext;
            this.dataListView = list;
        }
    
        /**
         * 设置ListView的对象
         *
         * @param lv
         */
        public void setListView(ListView lv) {
            this.listView2 = lv;
        }
    
        /**
         * update listview 单条数据
         *
         * @param item 新数据对象
         */
        public void updateItemData(MainActivity.MyListItem item) {
            Message msg = Message.obtain();
            int ids = -1;
            // 进行数据对比获取对应数据在list中的位置
            for (int i = 0; i < dataListView.size(); i++) {
                if (dataListView.get(i).getPosition() == item.getPosition()) {
                    ids = i;
                }
            }
            msg.arg1 = ids;
            // 更新mDataList对应位置的数据
            dataListView.set(ids, item);
            // handle刷新界面
            han.sendMessage(msg);
        }
        @SuppressLint("HandlerLeak")
        private Handler han = new Handler()
        {
            public void handleMessage(android.os.Message msg)
            {
                updateItem(msg.arg1);
            };
        };
        /**
         * 刷新指定item
         *
         * @param index item在listview中的位置
         */
        private void updateItem(int index)
        {
            if (listView2 == null)
            {
                return;
            }
    
            // 获取当前可以看到的item位置
            int visiblePosition = listView2.getFirstVisiblePosition();
            // 如添加headerview后 firstview就是hearderview
            // 所有索引+1 取第一个view
            // View view = listview.getChildAt(index - visiblePosition + 1);
            // 获取点击的view
            View view = listView2.getChildAt(index - visiblePosition);
            TextView txt = (TextView) view.findViewById(R.id.textView1);
            // 获取mDataList.set(ids, item);更新的数据
            MainActivity.MyListItem data = (MainActivity.MyListItem) getItem(index);
            // 重新设置界面显示数据
            txt.setText(data.getData());
        }
    
        @Override
        public int getCount() {
            return dataListView.size();
        }
    
        @Override
        public Object getItem(int position) {
            return dataListView.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null)
            {
                convertView = LayoutInflater.from(context).inflate(R.layout.listview_item, null);
            }
            TextView txt = (TextView) convertView.findViewById(R.id.textView1);
            txt.setText(dataListView.get(position).getData());
            return convertView;
        }
    }
    

    gridView的刷新基本和这个方法一样,用到的请自行扩展

    相关文章

      网友评论

        本文标题:关于listView、gridView的item的局部刷新

        本文链接:https://www.haomeiwen.com/subject/eykcaqtx.html