当我长时间点击项目时,在RecyclerView中选择单选按钮时遇到问题
目前,我已经设置了RecyclerView,有一个默认的LayoutManager,并有一个显示所有数据的适配器。我最近刚刚让onClickListener()工作起来(尽管我不确定它应该放在onCreateViewHolder()还是onBindViewHolder*中(-不确定何时调用onBindViewHolder())。
我的SingelRow XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="80dp"
>
<ImageView
android:id="@+id/item_icon"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_alignParentLeft="true"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="1dp"
android:layout_marginBottom="1dp"
android:contentDescription="icon"
android:src="@drawable/ic_launcher"
/>
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/item_icon"
android:layout_alignBaseline="@+id/item_icon"
android:textColor="@android:color/darker_gray"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:textSize="22dp" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/radioButton"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
具有单选模式和ViewHolder 的My Adapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private static RadioButton lastChecked = null;
private static int lastCheckedPos = 0;
Context context;
private ArrayList<ItemData> itemsDatas;
public MyAdapter(ArrayList<ItemData> itemsDatas) {
this.itemsDatas = itemsDatas;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View itemLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout, null);
ViewHolder viewHolder = new ViewHolder(itemLayoutView);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
if (position == 0 && itemsDatas.get(0).isSelected() && viewHolder.radioButton.isChecked()) {
viewHolder.radioButton.setActivated(true);
viewHolder.radioButton.setSelected(true);
lastChecked = viewHolder.radioButton;
lastCheckedPos = 0;
}
viewHolder.txtViewTitle.setText(itemsDatas.get(position).getTitle1());
viewHolder.imgViewIcon.setImageResource(itemsDatas.get(position).getImageUrl());
viewHolder.radioButton.setTag(this);
viewHolder.radioButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RadioButton cb = (RadioButton) v;
if (cb.isChecked()) {
if (lastChecked != null) {
lastChecked.setChecked(false);
itemsDatas.get(lastCheckedPos).setIsSelected(false);
}
lastChecked = cb;
lastCheckedPos = position;
} else
lastChecked = null;
itemsDatas.get(position).setIsSelected(cb.isChecked());
}
});
}
@Override
public int getItemCount() {
return itemsDatas.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
public TextView txtViewTitle;
public ImageView imgViewIcon;
public RadioButton radioButton;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
itemLayoutView.setOnClickListener(this);
itemLayoutView.setOnLongClickListener(this);
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
radioButton = (RadioButton) itemLayoutView.findViewById(R.id.radioButton);
}
@Override
public void onClick(View v) {
Log.d("TAG", "onClick " + getPosition() + " " + txtViewTitle.getText().toString());
}
@Override
public boolean onLongClick(View v) {
Log.d("TAG", "onLongClick " + getPosition() + " " + txtViewTitle.getText().toString());
return true;
}
}}
当我单击"打开单选按钮"时,它是"工作",但当我长时间单击"项目上的任何位置"时,我想要选择此项目中的"单选按钮"当我点击项目上的任何位置时,我不想将其用于其他工作
我尝试了很多解决方案但没有成功
如果有任何帮助,我将不胜感激。非常感谢。
这是ViewHolder 的修订版
class ViewHolder extends RecyclerView.ViewHolder {
public TextView txtViewTitle;
public ImageView imgViewIcon;
public RadioButton radioButton;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
.
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
radioButton = (RadioButton) itemLayoutView.findViewById(R.id.radioButton);
itemLayoutView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//what ever you want
}
});
itemLayoutView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if(!radioButton.isSelected()){
radioButton.setSelected(true);
}else{
radioButton.setSelected(false);
}
return false;
}
});
}
如果我没有弄错,你会问应该在哪里设置onLongClickListener
,在这种情况下,修改onCreateViewHolder
方法如下:
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View itemLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout, null);
itemLayoutView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//do something
return true;
}
});
ViewHolder viewHolder = new ViewHolder(itemLayoutView);
return viewHolder;
}