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


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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值