Android ListView的局部刷新

ListView的数据更新

ListView可以通过notifyDataSetChanged()来更新页面上的数据。
但是有的时候当这个ListView中所有的Item只有一个需要改变数据,则不适合适用notifyDataSetChanged()来更新页面.因为该方法会把所有的Item重新加载一遍。

一ListView的局部刷新要点:

1.找到页面上要刷新的Item,确定位置。
2.根据位置改变Adapter的数据源。
3.主动更新页面上的Item显示。
代码如下:

package com.jlu.zhangfy.listviewrefresh;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends Activity
{

    private ArrayList<MyListItem> list = null;
    private ListView lv;
    private MyListAdapter         adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intitData();
        lv = (ListView) findViewById(R.id.listView1);
        adapter = new MyListAdapter(list,getApplicationContext());
        lv.setAdapter(adapter);

        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);
                // 更新界面
                adapter.update(item.getPosition(),lv);
            }
        });

    }

    /**
     * 初始化数据
     */
    private void intitData()
    {
        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;
        }

    }
}

Adapter中的代码:

package com.jlu.zhangfy.listviewrefresh;

import android.content.Context;
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.ArrayList;

/**
 * Created by Administrator on 2016/7/15.
 */
public class MyListAdapter extends BaseAdapter{

    private ArrayList mList;
    private Context mContext;
    private LayoutInflater mLaouInflater;


    public MyListAdapter(ArrayList<MainActivity.MyListItem> list, Context context){
        mList = list;
        mContext = context;
        mLaouInflater = LayoutInflater.from(mContext);

    }
    @Override
    public int getCount() {
        this.notifyDataSetChanged();
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder = null;


        if(convertView == null){
            convertView = mLaouInflater.inflate(R.layout.listitem,parent,false);
            viewHolder = new ViewHolder();
            viewHolder.mTextView = (TextView) convertView.findViewById(R.id.tv);
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.mTextView.setText(((MainActivity.MyListItem) mList.get(position)).getData());
        return convertView;
    }

    class ViewHolder{
        private TextView mTextView;
    }

    public void update(int position, ListView mListView){

        ((MainActivity.MyListItem) mList.get(position)).setData("update date");

        int visiblePosition = mListView.getFirstVisiblePosition();
        View view = mListView.getChildAt(position - visiblePosition);
        TextView txt = (TextView) view.findViewById(R.id.tv);
        txt.setText("update date");


    }
}

对于局部刷新的重要意义会根据需求有所改变,但要点不变。

二利用框架的notifyDataSetChanged()也可以实现局部刷新(补充)

默认情况下:在只改变数据源某项的情况下notifyDataSetChanged()也只会更新页面中的一项。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值