【问题标题】:Using Radio button with recyclerview in android在android中使用带有recyclerview的单选按钮
【发布时间】:2016-12-20 21:18:00
【问题描述】:

这是我在回收站视图中的单选代码。我可以在回收站列表中选择单选,但是当我取消选择单选按钮时,我必须在单选按钮上单击两次才能再次启用,即再次选择单选按钮。任何人都可以帮我解决这个问题....

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.BaseAdapter;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class Address_Adapter extends RecyclerView.Adapter<Address_Adapter.AddresssHolder>{

    private List<Model_Address> listData;
    private LayoutInflater inflater;
    private Context context;
    private RadioButton rbChecked = null;
    private int rbPosoition = 0;

    public Address_Adapter(List<Model_Address> listData, Context context) {
        this.listData = listData;
        this.context = context;
        this.inflater = LayoutInflater.from(context);
    }

    @Override
    public AddresssHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.layout_recycler_address, parent,false);
        return new AddresssHolder(view,listData,context);    }

    @Override
    public void onBindViewHolder(final AddresssHolder holder, final int position) {
        Model_Address item = listData.get(position);
        holder.address.setText(item.getAddress());
        holder.state.setText(item.getState());
        holder.pin_code.setText(item.getPin_code());
        holder.contact.setText(item.getContact());

        if (holder.selected.isChecked()){
            rbPosoition = holder.getAdapterPosition();
            Toast.makeText(context, "" + rbPosoition, Toast.LENGTH_SHORT).show();
        }

    }

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

    public class AddresssHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private TextView address, state, pin_code, contact;
        private RadioButton selected;
        private  View container;
        private  List<Model_Address> listData;
        private Context context;

        public AddresssHolder(View itemView,List<Model_Address> listdata,Context context) {
            super(itemView);
            this.listData = listdata;
            this.context = context;
            itemView.setOnClickListener(this);
            address = (TextView) itemView.findViewById(R.id.text_address);
            state = (TextView) itemView.findViewById(R.id.state_text);
            pin_code = (TextView) itemView.findViewById(R.id.pin_code_text);
            contact = (TextView) itemView.findViewById(R.id.contact_text);
            selected = (RadioButton) itemView.findViewById(R.id.select_radioButton);
            if (rbPosoition == 0 && selected.isChecked())
            {
                rbChecked = selected;
                rbPosoition = 0;
            }
            selected.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    RadioButton rb = (RadioButton) v;
                    int clickedPos = getAdapterPosition();
                    if (rb.isChecked()){
                        if(rbChecked != null)
                        {
                            rbChecked.setChecked(false);
                        }
                        rbChecked = rb;
                        rbPosoition = clickedPos;
                    }
                    else{
                        rbChecked = null;
                        rbPosoition = 0;
                    }

                }
            });

        }

        @Override
        public void onClick(View v) {
            int positenter code hereion = getAdapterPosition();
        }
    }
}

【问题讨论】:

  • 为什么会有全局 RadioButton rbChecked ?
  • 获取选中单选按钮的引用..
  • 存储选中的单选按钮的位置然后取消选中或选中它会更明智(在回收后在屏幕上创建的检查事件或视图之后)
  • 我可以使用 getAdapterPosition() 存储选中的 RadioButton 的位置。但我不知道如何操作,因为当检查新的 RadioButton 时,它会给出当前适配器的位置,我不知道如何在特定的适配器位置操作 RadioButton。你能帮我写代码吗??跨度>

标签: android


【解决方案1】:

看看这个,希望对你有帮助

class MyViewHolder extends RecyclerView.ViewHolder{
    LinearLayout linear_row;
    RadioButton rb_room;
    TextView tv_amount, tv_booking_policy;

    public MyViewHolder(View itemView) {
        super(itemView);
        linear_row = (LinearLayout) itemView.findViewById(R.id.linear_row);
        rb_room = (RadioButton) itemView.findViewById(R.id.rb_room);
        tv_booking_policy = (TextView) itemView.findViewById(R.id.tv_booking_policy);
        tv_amount = (TextView) itemView.findViewById(R.id.tv_amount);

        linear_row.setOnClickListener(this);

        // use from here*********************
        View.OnClickListener l = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mSelectedItem = getAdapterPosition();
                notifyItemRangeChanged(0, roomList.size());
            }
        };

        itemView.setOnClickListener(l);
        rb_room.setOnClickListener(l);
        // till here************************
    }

        public void onBindViewHolder(final MyViewHolder holder, final int position) {
    holder.rb_room.setChecked(position == mSelectedItem); // from this you only get one radio button selected in recycler view
}

【讨论】:

    【解决方案2】:

    看看这个

    abstract class RadioAdapter<T> extends RecyclerView.Adapter<RadioAdapter.ViewHolder> {
    
    public int mSelectedItem = -1;
    private Context mContext;
    private List<T> mItems;
    
    public RadioAdapter(Context context, List<T> items) {
        mContext = context;
        mItems = items;
    }
    
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int i) {
        viewHolder.mRadio.setChecked(i == mSelectedItem);
    }
    
    @Override
    public int getItemCount() {
        return mItems.size();
    }
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        final View view = LayoutInflater.from(mContext).inflate(R.layout.view_radio_item, viewGroup, false);
        return new ViewHolder(view);
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder {
    
        public RadioButton mRadio;
        public TextView mText;
    
        public ViewHolder(final View inflate) {
            super(inflate);
            mText = (TextView) inflate.findViewById(R.id.text);
            mRadio = (RadioButton) inflate.findViewById(R.id.radio);
            View.OnClickListener l = v -> {
                mSelectedItem = getAdapterPosition();
                notifyItemRangeChanged(0, mItems.size());
            };
            itemView.setOnClickListener(l);
            mRadio.setOnClickListener(l);
        }
    }
    
    }
    

    我猜notifyItemRangeChanged() 方法可能就是你要找的。​​p>

    它基本上告诉适配器重新加载recyclerView中的数据

    来源:https://gist.github.com/mutexkid/4fcd3f7ba7d37ee69fee

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      相关资源
      最近更新 更多