一般來講,實(shí)現(xiàn)單選的方法都是使用RadioGroup,但是有時候,數(shù)據(jù)很多的時候,往往會很麻煩,要寫很多RadioButton,這就蛋疼了。所以就想著用ListView或RecyclerView + CheckBox來處理,應(yīng)該是個不錯的想法。
那么問題就來了,RecyclerView里面怎么才能實(shí)現(xiàn)單選呢。我們都知道,CheckBox是可以獨(dú)立的,多選的,這就糾結(jié)了。于是就想著,要是每一次選擇,都將上次選擇的取消掉,就可以了。然后就索性,每次選擇之前,先循環(huán)遍歷,將所有的項目設(shè)置為false,然后在設(shè)置自己要選中的項目,這樣應(yīng)該是個不錯的想法,下面我們就來看看怎么實(shí)現(xiàn)的吧,簡答粗暴的方法----上代碼:
/** * 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;//實(shí)現(xiàn)單選 變量保存當(dāng)前選中的position public GalleryAdapter(Context context, List<BusListBean> datats, RecyclerView view) { mContext = context; mInflater = LayoutInflater.from(context); mList = datats; mRecyclerView = view; //設(shè)置數(shù)據(jù)集時,找到默認(rèn)選中的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); } /** * 創(chuàng)建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; } /** * 設(shè)置值 */ @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) { //每次點(diǎn)擊選擇時,把看見的,看不見的的項目設(shè)置為非選擇狀態(tài) ViewHolder holder = (ViewHolder) mRecyclerView.findViewHolderForLayoutPosition(mSelectedPos); if (holder != null) { holder.cb_bus_change.setChecked(false); } else { notifyItemChanged(mSelectedPos); } mList.get(mSelectedPos).setSelected(false);//上次選中的條目,設(shè)置為false; //更新默認(rèn)選中的position; mSelectedPos = i; //最后設(shè)置要選中的那項; mList.get(mSelectedPos).setSelected(true); viewHolder.cb_bus_change.setChecked(true); } }); //下邊是關(guān)于異步加載網(wǎng)絡(luò)圖片的方法,// setHttpImage(bean.getBus_pic()); viewHolder.mImageView1.setImageDrawable(null); final String httpUrl = bean.getBus_pic(); viewHolder.mImageView1.setTag(httpUrl); //異步加載網(wǎng)絡(luò)圖片 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設(shè)置圖片,否則說明imageView已經(jīng)被重用到其他item if (httpUrl.equals(viewHolder.mImageView1.getTag())) { viewHolder.mImageView1.setImageBitmap((Bitmap) o); } } }.execute(); }}嘿,果然可以奧。哈哈哈
上面的代碼包含異步加載網(wǎng)絡(luò)圖片的方法,很簡單,自己看一下代碼應(yīng)該都能看懂。
ok,那就這樣吧。
新聞熱點(diǎn)
疑難解答