簡體   English   中英

帶復選框Android的ListView

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM