2013-05-03 79 views
0

下面的活动,ContactMailAdapter.class是我的列表视图适配器,包含复选框。如果我想获得已检查的行的位置。如何才能做到这一点。我的列表中有几个复选框,我可以选中多个复选框。我的逻辑是我应该存储每个已检查的位置。然后从我的数组列表中调用数据,但现在我无法从我的适配器中获取已检查项目的位置。带有复选框的ListView Android

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; 
             } 

            } 

           } 
          }); 
+0

检查我的答案。完整和最终的解决方案... – 2013-05-03 10:12:45

回答

0

你可以试试这个...

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,以便您的复选框在y时不会被取消选中ou滚动您的列表视图... 这是我的代码适用于您的复选框相同的代码..希望你得到它...

+0

请问什么是receipe_auto_id – Dimitri 2013-05-03 09:57:12

+0

对不起,这是从我的代码..你只是忽略了..并把int id = buttonView.getId();而不是recipe_auto_id到您的列表中。 – AndiM 2013-05-03 10:05:16

+0

它会得到该行在列表视图中的确切位置,或只是增加一个数字 – Dimitri 2013-05-03 10:05:59

1

这是我如何实现相同,但我用图像,而不是内置复选框来检查/取消选中列表项。

我的listview的单行包含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); 
       } 
      } 
     }); 

我这是怎么实现的,你需要同样的事情。如果你有任何疑问,你可以问我。

+0

我只想要检查项目的位置 – Dimitri 2013-05-03 10:17:16

+0

这是我在我的应用程序中做的。在我的情况下,我使用set标签将rowid存储到复选框。当点击复选框时,我得到他们的标签,并从该标签中获得他们的ID,我曾经存储在数组列表listofitemstodelete中。你还想要什么 ? – 2013-05-03 10:25:06

0

看一看here。本教程将介绍如何将复选框添加到listViews并处理更新和检查其状态

0

的概念,如果你的目的是要获取或商店检查项目,可以使用阵列适配器。看看这个code.It可能会帮助你。

/定义复选框,单击事件监听器/

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();