上图中有一个Recycler的东东,平时我们ListView上可见的Item处于内存中,而且他的Item则放在 这个Recycler中,第一次加载item时,当前页面中的convertView都为NULL,当滚出屏幕,这是时候 ConvertView不为空,所以新的一项会复用这个ConvertView!
解决方式:使用ArrayList记录每个checkbox 的点击状态
//需要注意的问题是在给BaseAdapter实例化的过程中传递的数据应该是不为NULL的也就是说getData()方法要在调用BaseAdapter付好值
实例:
package com.example.listviewfocus;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayList<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
private BaseAdapter baseAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
listView = (ListView)findViewById(R.id.lv);
baseAdapter = new MyBaseAdapter(MainActivity.this, list);
listView.setAdapter(baseAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//parent listview
Map<String, Object> item = (Map<String, Object>)parent.getItemAtPosition(position);
String strtitle = item.get("ck1").toString();
String strwz = item.get("ck2").toString();
Toast.makeText(MainActivity.this , strtitle+" "+strwz,Toast.LENGTH_SHORT).show();
// (CharSequence)listItem.get(position).get("title")
}
});
}
private void getData() {
list.clear();
Map<String ,Object> map = new HashMap<String ,Object>();
map.put("button","百度1");
map.put("ck1","www");
map.put("ck2","w2ww");
list.add(map);
map = new HashMap<String ,Object>();
map.put("button","百度2");
map.put("ck1","www");
map.put("ck2","w2ww");
list.add(map);
map = new HashMap<String ,Object>();
map.put("button","百度3");
map.put("ck1","www");
map.put("ck2","w2ww");
list.add(map);
map = new HashMap<String ,Object>();
map.put("button","百度4");
map.put("ck1","www");
map.put("ck2","w2ww");
list.add(map);
map = new HashMap<String ,Object>();
map.put("button","百度5");
map.put("ck1","www");
map.put("ck2","w2ww");
list.add(map);
map = new HashMap<String ,Object>();
map.put("button","百度6");
map.put("ck1","www");
map.put("ck2","w2ww");
list.add(map);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.listviewfocus.MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv">
</ListView>
</RelativeLayout>
package com.example.listviewfocus;
import android.content.Context;
import android.content.pm.ProviderInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Map;
public class MyBaseAdapter extends BaseAdapter {
private Context context;
private ArrayList<Map<String,Object>> list;
private LayoutInflater inflater;
private ArrayList<Boolean> ischecked ;
public MyBaseAdapter(Context context ,ArrayList<Map<String,Object>> list ){
System.out.println("--"+list.size());
this.context = context;
this.list = list;
int i;
ischecked = new ArrayList<Boolean>(list.size());
System.out.println("--"+list.size());
for (i=0;i<list.size();i++){
ischecked.add(i,false);
}
}
@Override
public int getCount() {
System.out.println("--getCount"+list.size());
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
class ViewHolder{
private Button button;
private CheckBox checkBox1;
private CheckBox checkBox2;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
if(convertView==null)
{
inflater= LayoutInflater.from(context);
view=inflater.inflate(R.layout.ltem_layout, null);
holder=new ViewHolder();
holder.button=(Button) view.findViewById(R.id.button);
holder.checkBox1=(CheckBox) view.findViewById(R.id.checkbox1);
holder.checkBox2=(CheckBox) view.findViewById(R.id.checkbox2);
view.setTag(holder);
}
else
{
view=convertView;
holder=(ViewHolder)view.getTag();
}
Map<String,Object> map=list.get(position);
System.out.println("--getview"+list.size());
String title=map.get("button").toString();
String info1=map.get("ck1").toString();
String info2=map.get("ck2").toString();
final int finaIp = position ;
holder.checkBox1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CheckBox checkBox = (CheckBox)v;
System.out.println(checkBox.isChecked()+"");
System.out.println(finaIp+"");
ischecked.set(finaIp ,checkBox.isChecked());
int i;
for (i=0;i<list.size();i++)
System.out.println(ischecked.get(i).toString());
}
});
holder.checkBox1.setId(position);
System.out.println("setId"+position);
holder.checkBox1.setChecked(ischecked.get(position));
System.out.println("setId"+ischecked.get(position));
holder.button.setText(title);;
holder.checkBox1.setText(info1);
holder.checkBox2.setText(info2);
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// list.remove(position);
// MainActivity.baseAdapter.notifyDataSetChanged();
}
});
return view;
}
private void initBoolean() {
int i;
for (i=0;i<list.size();i++){
ischecked.add(i,false);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button"
android:text="zhangyuwei"/>
<CheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/checkbox1"
android:text="nan"/>
<CheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/checkbox2"
android:text="nan"/>
<TextView
android:id="@+id/sdasdasd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="sdadssadsdsd"/>
</LinearLayout>