web-dev-qa-db-ja.com

recyclerviewからチェック済みチェックボックスのリストを取得android

RecyclerViewに画像、タイトル、チェックボックスを追加しました。私には2つの問題があります。

  1. イメージビューまたはリサイクラアイテム全体をクリックしたときにチェックボックスを選択する方法。

  2. Recyclerviewからすべてのチェック済みアイテムを取得して、次のアクティビティに移動する必要があります。

私のレイアウト:

<RelativeLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_margin="8dp">

        <ImageView
            Android:id="@+id/image"
            Android:layout_width="match_parent"
            Android:layout_height="150dp"
            Android:layout_gravity="center_horizontal"
            Android:contentDescription="Interests"
            Android:scaleType="centerCrop"
            Android:src="@drawable/ic_yash_dp" />

        <TextView
            Android:id="@+id/title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentBottom="true"
            Android:layout_alignParentLeft="true"
            Android:layout_alignParentStart="true"
            Android:layout_gravity="bottom"
            Android:layout_margin="5dp"
            Android:layout_marginTop="24dp"
            Android:background="@drawable/rounded_corners"
            Android:gravity="bottom"
            Android:padding="5dp"
            Android:text="GYM"
            Android:textAlignment="center"
            Android:textColor="@color/white" />

        <CheckBox
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/checkBox"
            Android:layout_margin="2dp"
            Android:layout_alignParentTop="true"
            Android:layout_alignParentRight="true"
            Android:layout_alignParentEnd="true" />

    </RelativeLayout>

私のアダプター:

@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
final InterestBean model = arrayList.get(position);
final int pos = position;

RecyclerViewHolder mainHolder = (RecyclerViewHolder) holder;// holder

Bitmap image = BitmapFactory.decodeResource(context.getResources(),
        model.getImage());// This will convert drawbale image into bitmap

// setting title
mainHolder.title.setText(model.getTitle());
mainHolder.imageview.setImageBitmap(image);
mainHolder.checkBox.setChecked(arrayList.get(position).isSelected());
mainHolder.checkBox.setTag(arrayList.get(position));


mainHolder.checkBox.setOnClickListener(new View.OnClickListener()     {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
InterestBean contact = (InterestBean) cb.getTag();

contact.setIsSelected(cb.isChecked());
arrayList.get(pos).setIsSelected(cb.isChecked());
selectedItems.add(pos);
Toast.makeText(
v.getContext(), pos + cb.isChecked(), Toast.LENGTH_LONG).show();
}
});}
14
Yashwanth

1つの簡単な解決策は、OnItemCheckListerを作成し、次のように実装することです。

public class MyAdapter extends RecyclerViewAdapter {

    interface OnItemCheckListener {
        void onItemCheck(Item item);
        void onItemUncheck(Item item);
    }

    ...

    @NonNull
    private OnItemCheckListener onItemCheckListener;

    public MyAdapter (List<Item> items, @NonNull OnItemCheckListener onItemCheckListener) {
        this.items = items;
        this.onItemClick = onItemCheckListener;
    }

    ...

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof MyViewHolder) {
            final Item currentItem = items.get(position);

            ...

            ((MyViewHolder) holder).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ((MyViewHolder) holder).checkbox.setChecked(
                            !((MyViewHolder) holder).checkbox.isChecked());
                    if (((MyViewHolder) holder).checkbox.isChecked()) {
                        onItemClick.onItemCheck(currentItem);
                    } else {
                        onItemClick.onItemUncheck(currentItem);
                    }
                }
            });
        }
    }

    static class MyViewHolder extends RecyclerView.ViewHolder {
        CheckBox checkbox;
        View itemView;

        ...

        public MyViewHolder(View itemView) {
            super(itemView);
            this.itemView = itemView;
            checkbox = (CheckBox) itemView.findViewById(R.id.checkbox);
            checkbox.setClickable(false);
            ...
        }

        public void setOnClickListener(View.OnClickListener onClickListener) {
            itemView.setOnClickListener(onClickListener);
        }
    }
}

次に、アクティビティでこれを実行できます。

    private List<Item> currentSelectedItems = new ArrayList<>();

    ...

    myAdapter = new MyAdapter(items, new MyAdapter.OnItemCheckListener() {
            @Override
            public void onItemCheck(Item item) {
                currentSelectedItems.add(item);
            }

            @Override
            public void onItemUncheck(Item item) {
                currentSelectedItems.remove(item);
            }
        });

その後、currentSelectedItemsを使用して何かを行うことができます。

注:このソリューションでは、アイテム全体が押されることを想定しているため、チェックボックスはクリック不可に設定されています。

43
ninjahoahong

Modelクラスを使用して、recyclerViewのチェック項目を取得できます。その他の参照:Android Recyclerviewチェックボックス

モデル

public class Model {

    private boolean isSelected;
    private String animal;

    public String getAnimal() {
        return animal;
    }

    public void setAnimal(String animal) {
        this.animal = animal;
    }

    public boolean getSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
}

アダプタ

import Android.content.Context;
 import Android.support.v7.widget.RecyclerView;
import Android.view.LayoutInflater;
    import Android.view.View;
 import Android.view.ViewGroup;
 import Android.widget.CheckBox;
 import Android.widget.TextView;
 import Android.widget.Toast;

 import Java.util.ArrayList;


  public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {

private LayoutInflater inflater;
public static ArrayList<Model> imageModelArrayList;
private Context ctx;

public CustomAdapter(Context ctx, ArrayList<Model> imageModelArrayList) {

    inflater = LayoutInflater.from(ctx);
    this.imageModelArrayList = imageModelArrayList;
    this.ctx = ctx;
}

@Override
public CustomAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = inflater.inflate(R.layout.rv_item, parent, false);
    MyViewHolder holder = new MyViewHolder(view);

    return holder;
}

@Override
public void onBindViewHolder(final CustomAdapter.MyViewHolder holder, int position) {

    holder.checkBox.setText("Checkbox " + position);
    holder.checkBox.setChecked(imageModelArrayList.get(position).getSelected());
    holder.tvAnimal.setText(imageModelArrayList.get(position).getAnimal());

   // holder.checkBox.setTag(R.integer.btnplusview, convertView);
    holder.checkBox.setTag(position);
    holder.checkBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Integer pos = (Integer) holder.checkBox.getTag();
            Toast.makeText(ctx, imageModelArrayList.get(pos).getAnimal() + " clicked!", Toast.LENGTH_SHORT).show();

            if (imageModelArrayList.get(pos).getSelected()) {
                imageModelArrayList.get(pos).setSelected(false);
            } else {
                imageModelArrayList.get(pos).setSelected(true);
            }
        }
    });


}

@Override
public int getItemCount() {
    return imageModelArrayList.size();
}

class MyViewHolder extends RecyclerView.ViewHolder {

    protected CheckBox checkBox;
    private TextView tvAnimal;

    public MyViewHolder(View itemView) {
        super(itemView);

        checkBox = (CheckBox) itemView.findViewById(R.id.cb);
        tvAnimal = (TextView) itemView.findViewById(R.id.animal);
    }

}
3
user6017633

from @ ninjahoahong onBindViewHolderメソッドにチェックボックスリスナを追加し、チェックボックスをクリックして[有効]をクリックできます。

viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int pos = viewHolder.getAdapterPosition();
            ChoiceItem currentItem = mChoice.get(pos);
            if(viewHolder.checkBox.isChecked()){
                onItemCheckListener.onItemCheck(currentItem);
                currentItem.setCheck(true);
            }else{
                onItemCheckListener.onItemUncheck(currentItem);
                currentItem.setCheck(false);
            }
        }
    });
0
Palida

Recyclerviewの2つのオーバーライドメソッドを追加するだけです

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return position;
}
0
Harish Reddy

1)mainHolder.imageview OnClickListenerを追加できます
2)2つのステップ:

  1. InterestBeanモデルboolen isCheckedに追加
  2. 次のアクティビティに移動して、すべてのInterestBeanを取得し、チェック済みのInterestBeanをすべて取得して保存します。

コード:

mainHolder.imageview.setOnClickListener(new View.OnClickListener()
    {
        public void onClick (View v)
        {
            mainHolder.checkBox.setChecked(!mainHolder.checkBox.isChecked());
        }
    }
    );
0
andrey7mel
recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() {
        @Override
        public void onClick(View view, int position) {
            List list= aList.get(position);
            //Toast.makeText(getApplicationContext(), movie.getTitle() + " is selected!", Toast.LENGTH_SHORT).show();
            action(list.getId());
        }

        @Override
        public void onLongClick(View view, int position) {

        }
    }));
0
Quang