ListView、RecyclerView CheckBox 单选实现,以及RecyclerView异步加载网络图片

来源:互联网 发布:淘宝店抽成 编辑:程序博客网 时间:2024/05/16 08:43


一般来讲,实现单选的方法都是使用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,那就这样吧。

1 0