我有一个自定义列表视图,其中包含一些元素和一个复选框。当我点击一个按钮。我想知道已经检查过的元素的位置。 以下是我的代码
public class Results extends ListActivity implements OnClickListener{
String[] donorName,donorPhone;
int totNumber;
Button callBut;
ListView listView;
List<RowItem> rowItems;
public static void main(String[] args) {
// TODO Auto-generated method stub
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.results);
Intent intent = getIntent();
donorName = intent.getStringArrayExtra("name");
donorPhone = intent.getStringArrayExtra("phone");
totNumber = intent.getExtras().getInt("totDonors");
callBut = (Button)findViewById(R.id.callBut);
callBut.setOnClickListener(this);
rowItems = new ArrayList<RowItem>();
for (int i = 0; i < totNumber; i++) {
RowItem item = new RowItem(donorName[i], donorPhone[i]);
rowItems.add(item);
}
ListAdapter adapter = new MySimpleArrayAdapter(this,
R.layout.list_item, rowItems);
setListAdapter(adapter);
};
///////////////////////////////////////////////////////////////////////////////////////////
public static class MySimpleArrayAdapter extends ArrayAdapter<RowItem> implements OnCheckedChangeListener {
Context context;
static List<RowItem> donorList = new ArrayList<RowItem>();
public MySimpleArrayAdapter(Context context, int resourceId,
List<RowItem> donorList) {
super(context, resourceId, donorList);
this.context = context;
this.donorList = donorList;
}
private class ViewHolder {
Button donorCall,exp;
TextView donorName;
TextView donorPhone;
CheckBox chkBox;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
final RowItem rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.donorName = (TextView) convertView.findViewById(R.id.donorName);
holder.donorPhone = (TextView) convertView.findViewById(R.id.donorPhone);
holder.donorCall = (Button) convertView.findViewById(R.id.donorCall);
holder.chkBox = (CheckBox) convertView.findViewById(R.id.chkBox);
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();
holder.donorPhone.setText(rowItem.getdonorPhoneS());
holder.donorName.setText(rowItem.getdonorNameS());
holder.chkBox.setTag(position);
holder.chkBox.setOnCheckedChangeListener(this);
holder.donorCall.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d("Button Clicked",position+"");
Intent startCall = new Intent(Intent.ACTION_CALL);
startCall.setData(Uri.parse("tel:" + rowItem.getdonorPhoneS()));
context.startActivity(startCall);
}
});
return convertView;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
int position = (Integer) buttonView.getTag();
if (isChecked) {
donorList.get(position).setSelected(true);
Log.d("Tag",donorList.get(position).isSelected()+"");
} else {
buttonView.setSelected(false);
Log.d("Unchecked",isChecked+"");
}
notifyDataSetChanged();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String msgRecipient;
Log.d("MSg","Button Clicked");
for (int x = 0; x<totNumber;x++){
if(MySimpleArrayAdapter.donorList.get(x).isSelected()){
Log.d("position Checked",x+"");
}
else
Log.d("position UnChecked",x+"");
}
}
}
当我点击某个项目的复选框时,我在 Log 中得到了真的。但是当我点击按钮时,所有元素都显示在未选中状态。
答案 0 :(得分:2)
您忘记在getView中设置复选框的选中状态,因此如果向下/向上滚动,您将显示旧的复选框,而不会更新。
你需要做的是拥有一组整数(或更好的sparseIntArray),选中复选框时将项目位置添加到其中,并在取消选中时删除。
为了获得所有选中的复选框,只需使用这组整数......
答案 1 :(得分:0)
您可以尝试此操作以了解适配器中的所选项目位置。
for(int i=0;i<MySimpleArrayAdapter.mCheckStates.size();i++)
{
if(MySimpleArrayAdapter.mCheckStates.get(i)==true)
{
// i is the position of a checked items
}
}
答案 2 :(得分:0)
这里可能会出现一些问题。
首先,您需要确保将ListView的setChoiceMode(ListActivity内部)设置为默认值以外的值。即:
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
有关详情,请参阅:Losing current selection when calling adapter.notifyDataSetChanged()
此外,您对notifyDataSetChanged()的调用可能会导致您的选择重置,如下所述:Losing current selection of list item after updating the listview items using notifyDataSetChanged