今天整理公司项目的时候,优化了一下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进行调用,这个不写了,比较简单