动态刷新ListView中的某个item

来源:互联网 发布:arctime字幕软件官方 编辑:程序博客网 时间:2024/06/05 15:06

1.需求

遇到一个需求,从手机里面获取到所有的视频后,可以选择多个视频文件进行上传操作,在列表展示里面,每个视频文件都会显示缩略图,且每个item中均包含checkbox,之前的做法是每次点击一个checkbox,刷新选择的总数,并更新整个listview中的item,这样消耗很大,而且缩略图在每次点击后会重新加载,使得UI变得卡顿。

2.解决思路

在可视范围内,点击某个item,则通过position得到该item对应的内容,然后对该内容进行更新,并通过适配器adapter的数据源(比如mList)的set(int postion,Object object)方法更新被选择的item即可。

3.代码

适配器
package demo.xzy.qh.com.listviewdemo_1_update_item_dynamin;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import java.util.List;/** * Company:QIHAN TECH * Date:2017/7/18 * Author:Created by XuZhuYun * Describe: */public class MyAdapter extends BaseAdapter {    private List<String> mList;    public List<String> getList() {        return mList;    }    public void setList(List<String> list) {        mList = list;        notifyDataSetChanged();    }    @Override    public int getCount() {        return mList == null ? 0 : mList.size();    }    @Override    public Object getItem(int position) {        return mList == null ? null : mList.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder mViewHolder = null;        if (convertView == null) {            mViewHolder = new ViewHolder();            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);            mViewHolder.mTitleTv = (TextView) convertView.findViewById(R.id.title_tv);            convertView.setTag(mViewHolder);        } else {            mViewHolder = (ViewHolder) convertView.getTag();        }        if (getCount() > 0) {            String value = mList.get(position);            mViewHolder.mTitleTv.setText(value);        }        return convertView;    }    public void updateItem(int position, ListView listView) {        int visibleFirstPosi = listView.getFirstVisiblePosition();        int visibleLastPosi = listView.getLastVisiblePosition();        if (position >= visibleFirstPosi && position <= visibleLastPosi) {            View view = listView.getChildAt(position - visibleFirstPosi);            //原来item的值            String chosedText = (String) getItem(position);            String newText = "哈哈哈哈哈";            //更新数据源指定位置的数据            mList.set(position, newText);            //通知适配器            notifyDataSetChanged();        }    }    class ViewHolder {        TextView mTitleTv;    }}
调用

package demo.xzy.qh.com.listviewdemo_1_update_item_dynamin;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import java.util.ArrayList;import java.util.List;/** * 动态更新listview中的item数据 */public class MainActivity extends Activity implements AdapterView.OnItemClickListener {    private MyAdapter mMyAdapter;    private ListView mListView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView = (ListView) findViewById(R.id.my_test_lv);        mMyAdapter = new MyAdapter();        mListView.setAdapter(mMyAdapter);        mListView.setOnItemClickListener(this);        initTestData();    }    private void initTestData() {        List<String> mStrList = new ArrayList<>();        for (int i = 0; i < 15; i++) {            mStrList.add("测试数据" + i);        }        if (mMyAdapter == null) {            return;        }        mMyAdapter.setList(mStrList);    }    @Override    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        String value = (String) mMyAdapter.getItem(position);        //动态更新        mMyAdapter.updateItem(position, mListView);    }}

4.参考

官方文档https://developer.android.google.cn/reference/android/widget/ListView.html