如果我使用recyclerview,如何选择单选按钮当我长时间点击物品上的任何位置时



当我长时间点击项目时,在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;
}

最新更新