您的位置:首页 > 理论基础 > 计算机网络

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

2017-02-09 22:53 771 查看
一般来讲,实现单选的方法都是使用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,那就这样吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐