listview中adapter不使用notifyDataSetChanged单刷子item

今天整理公司项目的时候,优化了一下Listview的刷新效果,我们经常使用的是notifyDataSetChanged,但是这个方法的作用的是刷新整个数据,而对我们实现单个item来说,譬如只刷新一个item中的checkbox,使用notifyDataSetChanged则并不是很好,尤其是涉及到网络通信的情况下,则会浪费用户的流量,体验不是很好。
单刷子Item的操作一般而言都是为了显示某个item下的一个控件的点击效果,如imageview图片的切换,checkbox的选择效果。
场景一:
activity A(下面简称A)中有一了Listview,点击listview的item(简称C),跳转到另外一个activity B(简称B),B中有个操作实现了C中checkbox的勾选,再回到原来页面,刷新C的状态,我们不执行notifyDataSetChanged,直接刷新子item,如何实现呢?
下面先看效果:

这里写图片描述

方法1:最直接的方法就是获取item的要刷新的控件,然后进行刷新:

public class MainActivity extends AppCompatActivity {
    TextView textView;
    ListView listView;
    MyAdapter myAdapter;
    List<TestBean> list;
    int currentPosition=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView= (ListView) findViewById(R.id.listview);
        list=new ArrayList<>();
        for (int i=0;i<40;i++)
        {
            list.add(new TestBean("这是第"+(i+1)+"item",false));
        }
        myAdapter=new MyAdapter(list,this);
        listView.setAdapter(myAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                Intent intent=new Intent(MainActivity.this,Main2Activity.class);
                currentPosition=position;
                startActivityForResult(intent,11);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode==RESULT_OK&&requestCode==11)
        {
            //更新操作

            /**
             * 注意getChildAt方法中的取值范围在
             * >= ListView.getFirstVisiblePosition() &&  <= ListView.getLastVisiblePosition();
             * 所以我们不能直接传递listview的position进去,不然会报空指针的异常
             * 我们可以计算当前Listview屏幕上的position,即resultPostion
             *
             */
            int resultPostion=currentPosition-listView.getFirstVisiblePosition();
            View view=listView.getChildAt(resultPostion);
            CheckBox checkBox= (CheckBox) view.findViewById(R.id.check);
            list.get(currentPosition).setFlag(true);
            checkBox.setChecked(true);
        }
    }
}

第二种方式,写一个接口回调:

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

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

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
       final  ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder=new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.item, null);
            viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.check);
            viewHolder.textView = (TextView) convertView.findViewById(R.id.text);
            convertView.setTag(viewHolder);
        }else {
            viewHolder= (ViewHolder) convertView.getTag();
        }
        viewHolder.textView.setText(list.get(position).getData());
        viewHolder.checkBox.setChecked(list.get(position).isFlag());
        viewHolder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(context,Main2Activity.class);
                ((MainActivity) context).startActivityForResult(intent, 11);
                //我们在这加上接口回调的操作,然后再主Activity中进行操作
                if (myCallBack!=null)
                {
                    myCallBack.getControlView(viewHolder.checkBox);
                }
            }
        });

        return convertView;
    }

    final class  ViewHolder {
        TextView textView;
        CheckBox checkBox;
    }
//自定义的接口
    MyCallBack myCallBack;
    public interface MyCallBack{
        void getControlView(CheckBox checkBox);
    }
    //外部调用方法
    public void setMyCallBack(MyCallBack myCallBack)
    {
        this.myCallBack=myCallBack;
    }

}

主Activity中:

public class MainActivity extends AppCompatActivity {

    TextView textView;
    ListView listView;
    MyAdapter myAdapter;
    List<TestBean> list;
    CheckBox mcheckBox;
    int currentPosition=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView= (ListView) findViewById(R.id.listview);
        list=new ArrayList<>();
        for (int i=0;i<40;i++)
        {
            list.add(new TestBean("这是第"+(i+1)+"item",false));
        }
        myAdapter=new MyAdapter(list,this);
        //注册接口
        myAdapter.setMyCallBack(new MyAdapter.MyCallBack() {
            @Override
            public void getControlView(CheckBox checkBox) {
            //得到点击的控件对象
                mcheckBox=checkBox;
            }
        });
        listView.setAdapter(myAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {

            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode==RESULT_OK&&requestCode==11)
        {

            mcheckBox.setChecked(true);
        }
    }
}

效果如上
方法三:
最后一个比较简单,在主activity中写一个公共方法,在adapter进行调用,这个不写了,比较简单

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值