您好我正在尝试获取已检查的项目并存储在数据库中,但是当我单击按钮保存以获取每次检查的项目大小时,每次大小为零。当单击列表项时,它仅选中项目的唯一大小,但是如果未选中项目则仍然如此。 所以它为我创造的问题帮助我谢谢。 这是我的代码
CustomAdapter.java
public class CustomAdapter extends ArrayAdapter<ContactDetails>{
List<ContactDetails> listcontacts=null;
private LayoutInflater mInflater=null;
private SparseBooleanArray mSelectedItemsIds;
public CustomAdapter(Activity context, List<ContactDetails> list) {
super(context, 0);
mInflater = context.getLayoutInflater();
mSelectedItemsIds = new SparseBooleanArray(list.size());
this.listcontacts=list;
}
@Override
public int getCount() {
return listcontacts.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView == null) {
view = mInflater.inflate(R.layout.contacts_row, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.txtname = (TextView) view.findViewById(R.id.textView_name);
viewHolder.txtphonenum = (TextView) view.findViewById(R.id.textView_phonenum);
viewHolder.checkbox = (CheckBox) view.findViewById(R.id.checkBox_check);
viewHolder.checkbox.setFocusable(false);
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
ContactDetails element = (ContactDetails) viewHolder.checkbox.getTag();
element.setSelected(buttonView.isChecked());
}
});
view.setTag(viewHolder);
viewHolder.checkbox.setTag(listcontacts.get(position));
} else {
view = convertView;
((ViewHolder) view.getTag()).checkbox.setTag(listcontacts.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.txtname.setText(listcontacts.get(position).getName());
holder.txtphonenum.setText(listcontacts.get(position).getPhonenumber());
holder.checkbox.setChecked(listcontacts.get(position).isSelected());
return view;
}
private static class ViewHolder {
TextView txtname;
TextView txtphonenum;
CheckBox checkbox;
}
}
MuListview类是
public class AddChoiceContactList extends Activity implements OnClickListener, OnItemClickListener{
private ListView listview=null;
private Context context=null;
private DataBaseHelper db=null;
CustomAdapter adapter=null;
private Button btnsave=null;
List<ContactDetails> list=new ArrayList<ContactDetails>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.choicelist);
context=this;
listview =(ListView)findViewById(R.id.listView_choice);
btnsave=(Button)findViewById(R.id.button_save);
btnsave.setOnClickListener(this);
listview.setOnItemClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
list=db.GetDataContacts();
if(list.size()>0){
//listview=getListView();
Toast.makeText(context, "size is: "+list.size(), Toast.LENGTH_LONG).show();
adapter=new CustomAdapter(AddChoiceContactList.this, list);
listview.setAdapter(adapter);
listview.setItemsCanFocus(false);
listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
else{
Toast.makeText(context, "No Contacts Add contats plz!", Toast.LENGTH_LONG).show();
}
}
@Override
public void onClick(View arg0) {
SparseBooleanArray checked=listview.getCheckedItemPositions();
// here m getting size zero when checked then Toast.makeText(context, "checked size is: "+checked.size(), Toast.LENGTH_LONG).show();
ArrayList<UpdatedContact> selectedItems = new ArrayList<UpdatedContact>();
for (int i = 0; i < checked.size(); i++) {
int position = checked.keyAt(i);
if (checked.valueAt(i)){
ContactDetails detils=adapter.getItem(position);
}
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
}
}
答案 0 :(得分:1)
首先将列表ArrayList<ContactDetails> checkedList
作为gloabl并在consstructor中初始化..
在自定义适配器
中编写如下方法private ArrayList<ContactDetails> getCheckedItems() {
return checkedList;
}
并像这样更改你的复选框更改监听器..
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
checkedList.add(list.get(position));
}else {
checkedList.remove(list.get(position));
}
}
});
并在adapter.getCheckedItems();
onItemClickListener
中致电Activity
然后您将获得所有已检查的项目..
答案 1 :(得分:0)
请尝试这样的事情。
在您的活动中:
private static HashMap<Integer,Integer> selectedPositions = new HashMap<Integer,Integer>();
public static boolean isSelected(int position){
System.out.println("#### Position: " + position + " Value: " + selectedPositions.containsKey(position));
return selectedPositions.containsKey(position);
}
public static void addSelection(int position){
System.out.println("#### Puttin Position: " + position);
selectedPositions.put(position,position);
}
public static void removeSelection(int position){
System.out.println("#### Removing Position: " + position);
selectedPositions.remove(position);
}
在适配器中:
checkbox.setChecked(MainActivity.isSelected(position));
checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton view, boolean state) {
// TODO Auto-generated method stub
if(state == true){
MainActivity.addSelection(position);
}else{
MainActivity.removeSelection(position);
}
}
});
现在就是这样,每当你想要遍历hasmap找到所选项目时,确保你在完成工作时清除它,否则你将一次又一次地堆积选定的位置。