一般來講,實現單選的方法都是使用RadioGroup,但是有時候,數據很多的時候,往往會很麻煩,要寫很多RadioButton,這就蛋疼了。所以就想著用ListView或RecyclerView + CheckBox來處理,應該是個不錯的想法。
那么問題就來了,RecyclerView里面怎么才能實現單選呢。我們都知道,CheckBox是可以獨立的,多選的,這就糾結了。于是就想著,要是每一次選擇,都將上次選擇的取消掉,就可以了。然后就索性,每次選擇之前,先循環遍歷,將所有的項目設置為false,然后在設置自己要選中的項目,這樣應該是個不錯的想法,下面我們就來看看怎么實現的吧,簡答粗暴的方法----上代碼:
/** * Created by zhong on 2017/1/10. */public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.ViewHolder> {    PRivate Context mContext;    private LayoutInflater mInflater;    private List<BusListBean> mList;    private RecyclerView mRecyclerView;    private int mSelectedPos = 0;//實現單選  變量保存當前選中的position    public GalleryAdapter(Context context, List<BusListBean> datats, RecyclerView view) {        mContext = context;        mInflater = LayoutInflater.from(context);        mList = datats;        mRecyclerView = view;        //設置數據集時,找到默認選中的position        for (int a = 0; a < mList.size(); a++) {            if (mList.get(a).isSelected()) {                mSelectedPos = a;            }        }    }    public static class ViewHolder extends RecyclerView.ViewHolder {        private TextView mSeat;        private TextView mLicence;        private LinearLayout rootView;        private CheckBox cb_bus_change;        private RoundedImageView mImageView;        private RoundedImageView mImageView1;        public ViewHolder(View arg0) {            super(arg0);            rootView = (LinearLayout) arg0.findViewById(R.id.rootView);            cb_bus_change = (CheckBox) arg0.findViewById(R.id.cb_bus_change);            mImageView = (RoundedImageView) arg0.findViewById(R.id.riv_outside);            mImageView1 = (RoundedImageView) arg0.findViewById(R.id.imageView1);            mSeat = (TextView) arg0.findViewById(R.id.seat);            mLicence = (TextView) arg0.findViewById(R.id.licence);        }    }    @Override    public int getItemCount() {        return mList.size();    }    @Override    public void onViewRecycled(ViewHolder holder) {        super.onViewRecycled(holder);    }    /**     * 創建ViewHolder     */    @Override    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {        View view = mInflater.inflate(R.layout.activity_order_change_bus_item,                viewGroup, false);        ViewHolder viewHolder = new ViewHolder(view);        return viewHolder;    }    /**     * 設置值     */    @Override    public void onBindViewHolder(final ViewHolder viewHolder, final int i) {//        final String new_bus_id = bean.getId();        final BusListBean bean = mList.get(i);        viewHolder.cb_bus_change.setChecked(bean.isSelected());        viewHolder.rootView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //每次點擊選擇時,把看見的,看不見的的項目設置為非選擇狀態                ViewHolder holder = (ViewHolder) mRecyclerView.findViewHolderForLayoutPosition(mSelectedPos);                if (holder != null) {                    holder.cb_bus_change.setChecked(false);                } else {                    notifyItemChanged(mSelectedPos);                }                mList.get(mSelectedPos).setSelected(false);//上次選中的條目,設置為false;                //更新默認選中的position;                mSelectedPos = i;                //最后設置要選中的那項;                mList.get(mSelectedPos).setSelected(true);                viewHolder.cb_bus_change.setChecked(true);            }        });        //下邊是關于異步加載網絡圖片的方法,//        setHttpImage(bean.getBus_pic());        viewHolder.mImageView1.setImageDrawable(null);        final String httpUrl = bean.getBus_pic();        viewHolder.mImageView1.setTag(httpUrl);        //異步加載網絡圖片        new AsyncTask() {            @Override            protected Object doInBackground(Object[] params) {                try {                    URL picUrl = new URL(httpUrl);                    Bitmap bitmap = BitmapFactory.decodeStream(picUrl.openStream());                    return bitmap;                } catch (Exception e) {                    e.printStackTrace();                }                return null;            }            @Override            protected void onPostExecute(Object o) {                super.onPostExecute(o);                //加載完畢后判斷該imageView等待的圖片url是不是加載完畢的這張                //如果是則為imageView設置圖片,否則說明imageView已經被重用到其他item                if (httpUrl.equals(viewHolder.mImageView1.getTag())) {                    viewHolder.mImageView1.setImageBitmap((Bitmap) o);                }            }        }.execute();    }}嘿,果然可以奧。哈哈哈
上面的代碼包含異步加載網絡圖片的方法,很簡單,自己看一下代碼應該都能看懂。
ok,那就這樣吧。
新聞熱點
疑難解答