在之前的項目開發(fā)中就碰到過列表的單選奸攻、多選、全選虱痕、取消的效果睹耐,那個時候的實現(xiàn)方式是采用Listview+RaidonButton或者ListView+CheckBox的方式實現(xiàn),不過感覺采用Listview+RaidonButton或者ListView+CheckBox的方式實現(xiàn)效果并不是很好部翘,要處理Listview的條目點擊和CheckBox或者RaidonButton點擊的沖突疏橄,同時還要關(guān)聯(lián)條目點擊和CheckBox或者RaidonButton選擇的聯(lián)動,所有最近換RecyclerView+ImageView方式將效果又寫了下略就,RecyclerView+ImageView的方式就不需要去處理點擊沖突和聯(lián)動這些問題捎迫。
RecyclerView+ImageView實現(xiàn)單選
代碼如下:
public class SingleActivity extends AppCompatActivity {
private RecyclerView recyclerview;
private List<Datainfo> datas = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single);
getData();
recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
//設(shè)置布局管理器
recyclerview.setLayoutManager(new LinearLayoutManager(this));
SingleAdater adapter = new SingleAdater(this, datas);
//設(shè)置適配器
recyclerview.setAdapter(adapter);
}
class SingleAdater extends RecyclerView.Adapter<SingleAdater.SingleHolder> {
private List<Datainfo> mData;
private Context mContext;
private LayoutInflater mInflater;
public SingleAdater(Context context, List<Datainfo> list) {
this.mContext = context;
mInflater = LayoutInflater.from(mContext);
this.mData = new ArrayList<>();
if (mData != null) {
this.mData.addAll(list);
}
}
/**
* 刷新數(shù)據(jù)
*
* @param list
*/
public void nodfiyData(List<Datainfo> list) {
if (list != null) {
this.mData.clear();
this.mData.addAll(list);
}
notifyDataSetChanged();
}
@Override
public SingleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.single_item, parent, false);
SingleHolder holder = new SingleHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final SingleHolder holder, int position) {
final Datainfo datainfo = mData.get(position);
holder.tvItem.setText(datainfo.itemContent);
final boolean isCheck = datainfo.isCheck;
if (isCheck) {
//被選
holder.ivCheck.setImageResource(R.drawable.image_check);
} else {
//未被選
holder.ivCheck.setImageResource(R.drawable.image_uncheck);
}
holder.llLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String newId = datainfo.itemId;
for (Datainfo datainfo1 : datas) {
String oldId = datainfo1.itemId;
if (newId.equals(oldId)) {
datainfo1.isCheck = true;
}else{
datainfo1.isCheck = false;
}
}
//刷新數(shù)據(jù)
nodfiyData(datas);
}
});
}
@Override
public int getItemCount() {
return mData.size();
}
class SingleHolder extends RecyclerView.ViewHolder {
ImageView ivCheck;
TextView tvItem;
LinearLayout llLayout;
public SingleHolder(View itemView) {
super(itemView);
ivCheck = (ImageView) itemView.findViewById(R.id.iv_check);
tvItem = (TextView) itemView.findViewById(R.id.tv_item);
llLayout = (LinearLayout) itemView.findViewById(R.id.ll_layout);
}
}
}
private void getData() {
for (int i = 0; i < 40; i++) {
Datainfo info = new Datainfo();
info.isCheck = false;
info.itemContent = "item" + i;
info.itemId = "" + i;
datas.add(info);
}
}
}
GIF.gif
并沒有影響條目點擊事件,同時列表數(shù)據(jù)并沒有出現(xiàn)錯亂表牢;因為RecyclerView本身是沒有條目點擊事件的窄绒,所以這里并不需給RecyclerView設(shè)置條目點擊,直接給item條目設(shè)置點擊事件崔兴,在對點擊時處理imageview的背景要好處理寫彰导。
RecyclerView+ImageView實現(xiàn)多選蛔翅、全選、取消效果
代碼如下:
public class MoreActivity extends AppCompatActivity{
private RecyclerView recyclerview;
private List<Datainfo> datas = new ArrayList<>();
private MoreAdpter adapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_more);
getData();
recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
//設(shè)置布局管理器
recyclerview.setLayoutManager(new LinearLayoutManager(this));
//設(shè)置adapter
adapter =new MoreAdpter(this,datas);
recyclerview.setAdapter(adapter);
}
/**
* 全選
* @param view
*/
public void btnAll(View view){
setData(true);
}
/**
* 取消
* @param view
*/
public void btnCanl(View view){
setData(false);
}
/**
* 根據(jù)全選或取消設(shè)置數(shù)據(jù)
* @param isAll 是否全選
*/
private void setData(boolean isAll){
for (Datainfo data : datas) {
if(isAll){
data.isCheck=true;
}else{
data.isCheck=false;
}
}
//刷新數(shù)據(jù)
adapter.nodfiyData(datas);
}
class MoreAdpter extends RecyclerView.Adapter<MoreAdpter.MoreHolder>{
private List<Datainfo> mData;
private Context mContext;
private LayoutInflater mInflater;
public MoreAdpter(Context context, List<Datainfo> list) {
this.mContext = context;
mInflater = LayoutInflater.from(mContext);
this.mData = new ArrayList<>();
if (mData != null) {
this.mData.addAll(list);
}
}
/**
* 刷新數(shù)據(jù)
*
* @param list
*/
public void nodfiyData(List<Datainfo> list) {
if (list != null) {
this.mData.clear();
this.mData.addAll(list);
}
notifyDataSetChanged();
}
@Override
public MoreHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.single_item, parent, false);
MoreHolder holder = new MoreHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MoreHolder holder, int position) {
final Datainfo datainfo = mData.get(position);
holder.tvItem.setText(datainfo.itemContent);
final boolean isCheck = datainfo.isCheck;
if (isCheck) {
//被選
holder.ivCheck.setImageResource(R.drawable.image_check);
} else {
//未被選
holder.ivCheck.setImageResource(R.drawable.image_uncheck);
}
holder.llLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String newId = datainfo.itemId;
for (Datainfo datainfo1 : datas) {
String oldId = datainfo1.itemId;
if (newId.equals(oldId)) {
boolean isCheck1 = datainfo1.isCheck;
if(isCheck1){
datainfo1.isCheck=false;
}else{
datainfo1.isCheck=true;
}
break;
}
}
//刷新數(shù)據(jù)
nodfiyData(datas);
}
});
}
@Override
public int getItemCount() {
return mData.size();
}
class MoreHolder extends RecyclerView.ViewHolder{
ImageView ivCheck;
TextView tvItem;
LinearLayout llLayout;
public MoreHolder(View itemView) {
super(itemView);
ivCheck = (ImageView) itemView.findViewById(R.id.iv_check);
tvItem = (TextView) itemView.findViewById(R.id.tv_item);
llLayout = (LinearLayout) itemView.findViewById(R.id.ll_layout);
}
}
}
private void getData() {
for (int i = 0; i < 40; i++) {
Datainfo info = new Datainfo();
info.isCheck = false;
info.itemContent = "item" + i;
info.itemId = "" + i;
datas.add(info);
}
}
}
GIF.gif
同樣不影響條目點擊位谋,列表數(shù)據(jù)也沒有出現(xiàn)錯亂山析。