我为listview实现了cutomAdapter。我在里面实现了一些复选框。问题是,当我选中第一个位置的复选框时,会检查其他一些复选框。
这是我的适配器......
public class AScustomadapter extends BaseAdapter {
private ArrayList<String> mListItems;
private LayoutInflater mLayoutInflater;
int i = 0;
public AScustomadapter(Context context, ArrayList<String> arrayList){
mListItems = arrayList;
//get the layout inflater
mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return mListItems.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int position, View view, ViewGroup viewGroup) {
// create a ViewHolder reference
ViewHolder holder;
//check to see if the reused view is null or not, if is not null then reuse it
if (view == null) {
holder = new ViewHolder();
view = mLayoutInflater.inflate(R.layout.list_item, null);
holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view);
holder.b1 = (Button) view.findViewById(R.id.button1);
holder.cb1 = (CheckBox) view.findViewById(R.id.checkBox1);
// the setTag is used to store the data within this view
view.setTag(holder);
} else {
// the getTag returns the viewHolder object set as a tag to the view
holder = (ViewHolder)view.getTag();
}
//get the string item from the position "position" from array list to put it on the TextView
final String stringItem = mListItems.get(position);
if (stringItem != null) {
if (holder.itemName != null) {
//set the item name on the TextView
holder.itemName.setText(stringItem);
}
}
//button
holder.b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(v.getContext(), ASreviewCA.class);
i.putExtra("sItem", stringItem);
v.getContext().startActivity(i);
}
});
//view
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (position == 0) {
}
Log.d("LIST", "Selected item # " + position);
}
});
holder.cb1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {
i++;
Toast toast = Toast.makeText(buttonView.getContext(), String.valueOf(i), Toast.LENGTH_SHORT);
toast.show();
}else {
i--;
Toast toast = Toast.makeText(buttonView.getContext(), String.valueOf(i), Toast.LENGTH_SHORT);
toast.show();
}
}
});
//this method must return the view corresponding to the data at the specified position.
return view;
}
/**
* Static class used to avoid the calling of "findViewById" every time the getView() method is called,
* because this can impact to your application performance when your list is too big. The class is static so it
* cache all the things inside once it's created.
*/
private static class ViewHolder {
protected TextView itemName;
protected Button b1;
protected CheckBox cb1;
}
}
答案 0 :(得分:1)
为Adapter类中的已检查位置维护一个ArrayList,并在getView()方法中检查已检查的位置。喜欢......
private ArrayList<Integer> checkedIndices = new ArrayList<Integer>();
.......
@Override
public View getView(final int position, View view, ViewGroup viewGroup) {
// create a ViewHolder reference
ViewHolder holder;
//check to see if the reused view is null or not, if is not null then reuse it
if (view == null) {
holder = new ViewHolder();
view = mLayoutInflater.inflate(R.layout.list_item, null);
holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view);
holder.b1 = (Button) view.findViewById(R.id.button1);
holder.cb1 = (CheckBox) view.findViewById(R.id.checkBox1);
// the setTag is used to store the data within this view
view.setTag(holder);
} else {
// the getTag returns the viewHolder object set as a tag to the view
holder = (ViewHolder)view.getTag();
}
//get the string item from the position "position" from array list to put it on the TextView
final String stringItem = mListItems.get(position);
if (stringItem != null) {
if (holder.itemName != null) {
//set the item name on the TextView
holder.itemName.setText(stringItem);
}
}
//button
holder.b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(v.getContext(), ASreviewCA.class);
i.putExtra("sItem", stringItem);
v.getContext().startActivity(i);
}
});
//view
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (position == 0) {
}
Log.d("LIST", "Selected item # " + position);
}
});
holder.cb1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {
Toast toast = Toast.makeText(buttonView.getContext(), "Checked = "+position, Toast.LENGTH_SHORT);
toast.show();
checkedIndices.add(position);
}else {
Toast toast = Toast.makeText(buttonView.getContext(), "Unchecked = "+position, Toast.LENGTH_SHORT);
toast.show();
checkedIndices.remove((Integer)position));
}
}
});
if(checkedIndices.contains((Integer)position) {
holder.cb1.setChecked(true);
} else {
holder.cb1.setChecked(false);
}
//this method must return the view corresponding to the data at the specified position.
return view;
}
在Adapter类中编写一个方法,如...
public int getTotalCheckedCount() {
return checkedIndices.size();
}
答案 1 :(得分:0)
为了避免ListView中的CheckBoxes出现问题,您可以在开头使用一个初始化为false的布尔数组,然后在ListView中选中复选框的数组中的相应位置为true。当您在应用程序中向前和向后移动或滚动ListView时,这不会导致复选框的选中状态出现问题。您可以在此处查看我的示例代码: