一般来讲,实现单选的方法都是使用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,那就这样吧。
新闻热点
疑难解答