动态刷新ListView中的某个item

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值