ListView的局部更新,不调用notify方法

         局部刷新ListView,在很多场景下需要使用,比如下载界面,同时下载很多数据,进度条需要不停的改变,如果我们用notify的话,那么,就会出现屏幕闪屏的情况。那么我们怎么解决这个问题呢?

        这就是listView的局部刷新,布局是一个ListView,ListView的条目布局是一个简单的TextView。具体代码如下:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView lv;
    private List
   
   
    
     list = new ArrayList
    
    
     
     ();
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		//找到ListView控件
        lv = (ListView) findViewById(R.id.lv);
		//得到数据
        initData();
		//得到适配器对象,将数据和上下文传递过去
        adapter = new MyAdapter(this, list);
		//设置适配器
        lv.setAdapter(adapter);
		//listView的条目点击事件
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView
     
      parent, View view, int position, long id) {
				//调用刷新条目的方法(String data是要改变的数据)
                    updateView(int position,String data);
            }
        });
    }

//模拟数据
    private void initData() {
        for (int i = 0; i < 50; i++) {
            list.add(i + "");
        }
    }
	//判断点击的位置是否在屏幕显示的地方,是的话就调用改变item的方法
private void updateView(int position,String data){
    int firstVisi = lv.getFirstVisiblePosition();
	//判断点击的位置是否在屏幕显示的地方
    if (position - firstVisi > 0) {
        View v = lv.getChildAt(position-firstVisi);
		//适配器里面改变点击条目的方法
        adapter.updateData(v, position);
    }
}

}

下面是适配器的代码:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

/**
 * Created by peng on 2016/12/21.
 */

public class MyAdapter extends BaseAdapter {
    private Context context;
    private List
     
     
      
       list;

    public MyAdapter(Context context, List
      
      
       
        list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.item, null);
            holder.tv = (TextView) convertView.findViewById(R.id.tv);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        String str = list.get(position);
        holder.tv.setText(str);
        return convertView;
    }

    class ViewHolder {
        TextView tv;
    }

//刷新局部数据的方法
    public void updateData(View view, int position) {
        ViewHolder holder = (ViewHolder) view.getTag();

        holder.tv.setText("局部更新" + position);
    }
}
      
      
     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值