[英]ListView with Checkboxes Android
下面的活動ContactMailAdapter.class
是我的包含復選框的列表視圖適配器。 如果我想獲得已檢查的行的位置。 如何才能做到這一點。 我的列表中有幾個復選框,可以選中多個復選框。 我的邏輯是我應該存儲已檢查的每個位置。 然后從我的數組列表中調用數據,但是現在我無法從適配器獲取被檢查項的位置。
public class ContactMailAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<Destinataire> data;
private static LayoutInflater inflater = null;
ViewHolder holder;
static String src;
PopMessage main;
public ContactMailAdapter(Activity a, ArrayList<Destinataire> mArticles) {
activity = a;
data = mArticles;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public ContactMailAdapter (PopMessage m){
this.main=m;
}
@Override
public int getCount() {
return data.toArray().length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public static class ViewHolder {
public TextView one;
public TextView two;
public CheckBox check;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (convertView == null) {
vi = inflater.inflate(R.layout.popise_item, null);
holder = new ViewHolder();
holder.one = (TextView) vi.findViewById(R.id.title_top);
holder.two = (TextView) vi.findViewById(R.id.title_bottom);
holder.check = (CheckBox)vi.findViewById(R.id.search_imag);
vi.setTag(holder);
} else
holder = (ViewHolder) vi.getTag();
holder.one.setText(data.get(position).getName());
holder.two.setText(data.get(position).getEmail());
vi.findViewById(R.id.search_imag).setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (holder.check.isChecked())
System.out.println("false"+v.getId());
else
System.out.println("false");
}
});
holder.check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
}
});
/* vi.findViewById(R.id.search_image).setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
v.findViewById(R.id.search_image).setBackgroundResource(R.drawable.boutton_off);
if (holder.check.isChecked())
System.out.println("true");
else
System.out.println("false");
}
}); */
return vi;
}
}
新更新
ids = new ArrayList<String>();
if (ids.contains(holder.check.getId() + "")) {
holder.check.setChecked(true);
} else {
holder.check.setChecked(false);
}
holder.check
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
int id = buttonView.getId();
if (isChecked) {
if (ids.contains(id + "")) {
} else {
ids.add(id + "");
id++;
System.out.println( "receipe" + id);
}
} else {
if (ids.contains(id + "")) {
ids.remove(id + "");
System.out.println( "receipe" + id);
// ids--;
} else {
// id = 0;
}
}
}
});
這是我實現相同方法的方式,但是我使用圖像而不是內置復選框來檢查/取消選中列表項。
我的列表視圖的單行包含TextView和Imageview。
下面是ArrayAdapter和listview的onItemClick()事件的代碼:
static class Category {
String cat_name = "";
int cat_id = 0;
Boolean checked = false;
Category(int cat_id, String name) {
this.cat_name = name;
this.cat_id = cat_id;
}
public int getId() {
return cat_id;
}
public String getCatName() {
return cat_name;
}
public Boolean getChecked() {
return checked;
}
public void setChecked(Boolean checked) {
this.checked = checked;
}
public boolean isChecked() {
return checked;
}
public void toggleChecked() {
checked = !checked;
}
}
static class CategoryViewHolder {
ImageView imageViewCheck;
TextView textViewCategoryName;
public CategoryViewHolder(ImageView iv_check, TextView tv_category_name) {
imageViewCheck = iv_check;
textViewCategoryName = tv_category_name;
}
public ImageView getImageViewCheck() {
return imageViewCheck;
}
public TextView getTextViewCategoryName() {
return textViewCategoryName;
}
}
static class CategoryArrayAdapter extends ArrayAdapter<Category> {
LayoutInflater inflater;
public CategoryArrayAdapter(Context context, List<Category> categoryList) {
super(context, R.layout.single_row_delete_data,
R.id.textViewSingleRowDeleteData, categoryList);
inflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Category category = (Category) this.getItem(position);
final ImageView imageViewCheck;
final TextView textViewCN;
if (convertView == null) {
convertView = inflater.inflate(R.layout.single_row_delete_data,
null);
imageViewCheck = (ImageView) convertView
.findViewById(R.id.imageViewSingleRowDeleteData);
textViewCN = (TextView) convertView
.findViewById(R.id.textViewSingleRowDeleteData);
convertView.setTag(new CategoryViewHolder(imageViewCheck,
textViewCN));
}
else {
CategoryViewHolder viewHolder = (CategoryViewHolder) convertView
.getTag();
imageViewCheck = viewHolder.getImageViewCheck();
textViewCN = viewHolder.getTextViewCategoryName();
}
imageViewCheck.setFocusable(false);
imageViewCheck.setFocusableInTouchMode(false);
imageViewCheck.setClickable(true);
imageViewCheck.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
ImageView iv = (ImageView) v;
Category category = (Category) iv.getTag();
if (category.getChecked() == false) {
imageViewCheck.setImageResource(R.drawable.set_check);
listOfItemsToDelete.add(category.getId());
category.setChecked(true);
} else {
imageViewCheck
.setImageResource(R.drawable.set_basecircle);
listOfItemsToDelete.remove((Integer) category.getId());
category.setChecked(false);
}
}
});
imageViewCheck.setTag(category);
if (category.getChecked() == true)
imageViewCheck.setImageResource(R.drawable.set_check);
else
imageViewCheck.setImageResource(R.drawable.set_basecircle);
textViewCN.setText(category.getCatName());
return convertView;
}
}
ListView的onItemClick()
事件:
lv_delete_data.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
ImageView imageView = (ImageView) arg1
.findViewById(R.id.imageViewSingleRowDeleteData);
Category category = (Category) imageView.getTag();
if (category.getChecked() == false) {
imageView.setImageResource(R.drawable.set_check);
listOfItemsToDelete.add(category.getId());
category.setChecked(true);
} else {
imageView.setImageResource(R.drawable.set_basecircle);
listOfItemsToDelete.remove((Integer) category.getId());
category.setChecked(false);
}
}
});
這就是我實現的方式,您需要同樣的東西。 如果您有任何疑問,可以問我。
添加列表變量以保存檢查狀態
你可以試試這個...
List<String> ids = new ArrayList<String>();
holder.check_favourite.setId(position);
if (ids.contains(holder.check_favourite.getId() + "")) {
holder.check_favourite.setChecked(true);
} else {
holder.check_favourite.setChecked(false);
}
int id= 0;
holder.check_favourite
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
int check = buttonView.getId();
if (isChecked) {
if (ids.contains(check + "")) {
} else {
ids.add(check+ "");
id++;
}
} else {
if (ids.contains(check + "")) {
ids.remove(check + "");
id--;
} else {
}
}
}
});
使用if條件將復選框設置為true或false,以便在滾動列表視圖時不會取消選中復選框...這是我的代碼為復選框應用相同的代碼..希望您得到它...
在這里看看。 本教程介紹如何將復選框添加到listViews以及處理更新和檢查其狀態
看看這個示例,它將為您提供完美的解決方案,我已使用它來獲得項目中的選定位置。 它的工作原理像一種魅力
checkbox.settag and gettag() methods. hope this will help you .
http://amitandroid.blogspot.in/2013/03/android-listview-with-checkbox-and.html
如果您打算獲取或存儲選中的項目,則可以使用陣列適配器。 查看此代碼。它可能對您有幫助。
/ 定義復選框單擊事件監聽器 /
OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
CheckBox chk = (CheckBox) v;
int itemCount = getListView().getCount();
for(int i=0 ; i < itemCount ; i++){
getListView().setItemChecked(i, chk.isChecked());
}
}
};
/**Defining click event listener for the listitem checkbox**/
OnItemClickListener itemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
CheckBox chk = (CheckBox) findViewById(R.id.chkAll);
int checkedItemCount = getCheckedItemCount();
if(getListView().getCount()==checkedItemCount)
chk.setChecked(true);
else
chk.setChecked(false);
}
};
/**Getting reference to checkbox available in the main.xml layout**/
CheckBox chkAll = ( CheckBox ) findViewById(R.id.chkAll);
/**Setting a click listener for the checkbox**/
chkAll.setOnClickListener(clickListener);
/**Setting a click listener for the listitem checkbox**/
` getListView().setOnItemClickListener(itemClickListener); `
}
/ 返回檢查項目的數量 /
private int getCheckedItemCount()
{
int cnt = 0;
SparseBooleanArray positions = getListView().getCheckedItemPositions();
int itemCount = getListView().getCount();
for(int i=0;i<itemCount;i++){
if(positions.get(i))
cnt++;
}
return cnt;
}
並更新選中的項目,使用
SparseBooleanArray checked = getListView().getCheckedItemPositions();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.