如何实施Android Recyclerview项目点击AND复选框项目点击?

时间:2016-12-20 06:58:51

标签: java android android-recyclerview android-cardview android-checkbox

我有以下持有人工作,即我能够选中/取消选中复选框。 (该复选框是 RecyclerView 卡的一部分):

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
  holder.bindData(numbers.get(position));
  //in some cases, it will prevent unwanted situations
  holder.checkbox.setOnCheckedChangeListener(null);

  //if true, your checkbox will be selected, else unselected
  holder.checkbox.setChecked(numbers.get(position).isSelected());

  holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
       @Override
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
         numbers.get(holder.getAdapterPosition()).setSelected(isChecked);
       }
  });
}

我想在RecyclerView上实现点击该项目。所以,我从这个解决方案中获取了 - 请检查:https://stackoverflow.com/a/26196831/4013399

但是,现在,单击整个卡片项目可以正常工作,但无法选中/取消选中该复选框。怎么解决这个问题?

请帮忙。谢谢。

更新

我做了改变 - 但是," HERE-1,2和3"行从不输入。

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
Log.e("I AM ", "HERE-0");
holder.bindData(numbers.get(position));

final RelativeLayout rlyItem = holder.rlyItem;
final CheckBox checkbox = holder.checkbox;

rlyItem.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick(View view) {
        mListener.onItemClicked(holder.getLayoutPosition());
        Log.e("I AM ", "HERE-1");
    }
});

checkbox.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick(View view) {
        if (((CheckBox) view).isChecked()) {
            checkbox.setChecked(false);
            Log.e("I AM ", "HERE-2");
        } else {
            checkbox.setChecked(true);
            Log.e("I AM ", "HERE-3");
        }
        // Inform to Activity or the Fragment where the RecyclerView reside.
        mListener.onItemCheckBoxChecked(((CheckBox) view).isChecked(), holder.getLayoutPosition());
    }
});
//in some cases, it will prevent unwanted situations
holder.checkbox.setOnCheckedChangeListener(null);

//if true, your checkbox will be selected, else unselected
holder.checkbox.setChecked(numbers.get(position).isSelected());

checkbox.setOnCheckedChangeListener(new   CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        numbers.get(holder.getAdapterPosition()).setSelected(isChecked);
        Log.e("I AM ", "HERE-4");
        //Log.e(Integer.toString(holder.getAdapterPosition()), " IS CHECKED");
    }
});

}

5 个答案:

答案 0 :(得分:2)

首先,在复选框中添加以下属性

  android:clickable="false"
        android:focusable="false"
        android:longClickable="false"

以下是我的项目

 recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        Utils.hideSoftKeyboard(getActivity());
                       cityAdapter.itemSelected(position);
                    }
                }));

在适配器中添加以下方法:

 public void itemSelected(final int position) {
        if (townModelArrayList != null && !townModelArrayList.isEmpty()) {
            townModelArrayList.get(position).setSelected(!townModelArrayList.get(position).isSelected());
            notifyDataSetChanged();
        }
    }

答案 1 :(得分:1)

只需在适配器类中单击适配器膨胀视图,即可为您的复选框调用performClick()

 holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            holder.checkbox.performClick();
        }
    });

答案 2 :(得分:1)

我写了一个库来处理android recycleler view item click事件。您可以在https://github.com/ChathuraHettiarachchi/RecycleClick

中找到完整的教程
RecycleClick.addTo(YOUR_RECYCLEVIEW).setOnItemLongClickListener(new RecycleClick.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClicked(RecyclerView recyclerView, int position, View v) {
                // YOUR CODE
                return true;
            }
        });

或处理项目长按您可以使用

java -jar payara-micro.jar --deploy target/myapplication.war

要处理复选框,请单击适配器上的setCheckChangeListner

答案 3 :(得分:0)

我通过删除问题链接(https://stackoverflow.com/a/26196831/4013399)中引用的整个类解决了这个问题。相反,我只为复选框实现了一个onClick监听器。并且对于整个卡片视图项目单击?,您可能会问。为此,我只是为包含我的文本框的布局实现了另一个onClick监听器。 此外,为了保存复选框的状态,一个简单的设置和获取键,值对(如复选框位置," 1")(其中1表示已选中)并同时在SharedPreferences中更新它。

答案 4 :(得分:-1)

TL; DR

要在RecyclerView项目中实施RecyclerView项目单击和可单击视图,您需要为每个项目定义侦听器。

首先,您需要定义布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >
  <RelativeLayout
      android:id="@+id/item__rly"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="?android:selectableItemBackground"
      android:clickable="true"
      >

    <CheckBox
    android:id="@+id/item_cbx"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Sample CheckBox" />

  </RelativeLayout>

</android.support.v7.widget.CardView>

从上面的xml代码中,您可以使用:

找到RelativeLayout
android:background="?android:selectableItemBackground"
android:clickable="true"

这是为了使项目在点击时具有动画。

其次,您需要在适配器中定义单击侦听器接口,如下所示:

public class YourAdapter extends
    RecyclerView.Adapter<YourAdapter.ViewHolder> {

  private List<YourData> mDatas;

  // Define listener member variable
  private static OnRecyclerViewItemClickListener mListener;

  // Define the listener interface
  public interface OnRecyclerViewItemClickListener {
    void onItemClicked(int position);
    void onItemCheckBoxChecked(boolean isChecked, int position);
  }

  // Define the method that allows the parent activity or fragment to define the listener.
  public void setOnRecyclerViewItemClickListener(OnRecyclerViewItemClickListener listener) {
    this.mListener = listener;
  }

  public static class ViewHolder extends RecyclerView.ViewHolder {
    RelativeLayout rlyItem;
    CheckBox cbxSample;

    // We also create a constructor that accepts the entire item row
    // and does the view lookups to find each subview
    public ViewHolder(View itemView) {
      // Stores the itemView in a public final member variable that can be used
      // to access the context from any ViewHolder instance.
      super(itemView);
      rlyItem = (RelativeLayout) itemView.findViewById(R.id.item__rly);
      cbxSample = (CheckBox) itemView.findViewById(R.id.item_cbx);
    }
  }

  // Usually involves inflating a layout from XML and returning the holder
  @Override public ViewHolder onCreateViewHolder(ViewGroup parent,
      int viewType) {
    Context context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);

    // Inflate the custom layout
    View viewHolder = inflater.inflate(R.layout.item_layout, parent, false);

    // Return a new holder instance
    return new ViewHolder(viewHolder);
  }

  // Involves populating data into the item through holder
  @Override public void onBindViewHolder(final ViewHolder viewHolder, int position) {
    // Get the data model based on position
    final YourData data = mDatas.get(position);

    final RelativeLayout rlyItem = viewHolder.rlyItem;
    CheckBox cbxSample = viewHolder.cbxSample;

    rlyItem.setOnClickListener(new View.OnClickListener() {
      @Override public void onClick(View view) {
        mListener.onItemClicked(viewHolder.getLayoutPosition());
      }
    });

    cbxSample.setOnClickListener(new View.OnClickListener() {
      @Override public void onClick(View view) {
        if (((CheckBox) v).isChecked()) {
          cbxSample.setChecked(false);
        } else {
          cbxSample.setChecked(true);
        }
        // Inform to Activity or the Fragment where the RecyclerView reside.
        mListener.onItemCheckBoxChecked(((CheckBox) v).isChecked(), viewHolder.getLayoutPosition());
      }
    });

  }

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

然后,在RecyclerView代码所在的Activity或Fragment中,您需要设置监听器:

yourAdapter.setOnRecyclerViewItemClickListener(new YourAdapter.OnRecyclerViewItemClickListener() {
  @Override 
  public void onItemClicked(int position) {
    // Do something when item clicked.   
  }

  @Override
  public void onItemCheckBoxChecked(boolean isChecked, int position) {
    // Do something when check box check state change.
  }
});

<强>增加:
要在ReyclerView中保持项目状态,您需要使用SparseBooleanArray