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