前言
創(chuàng)新互聯(lián)專(zhuān)注于瑞麗網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供瑞麗營(yíng)銷(xiāo)型網(wǎng)站建設(shè),瑞麗網(wǎng)站制作、瑞麗網(wǎng)頁(yè)設(shè)計(jì)、瑞麗網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造瑞麗網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供瑞麗網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
今天給大家分享是如何在RecyclerView實(shí)現(xiàn)全選,ItemTouchHelper實(shí)現(xiàn)側(cè)滑刪除,拖拽功能。比較基礎(chǔ)。關(guān)于RecyclerView的強(qiáng)大,就不多說(shuō)了。在Android L SDK發(fā)布的新API中最有意思的就是RecyclerView 和 CardView了, 按照官方的說(shuō)法, RecyclerView 一個(gè)ListView 的一個(gè)更高級(jí)更靈活的一個(gè)版本, 可以自定義的東西太多了。
效果:
RecyclerView實(shí)現(xiàn)全選,ItemTouchHelper實(shí)現(xiàn)側(cè)滑刪除,拖拽功能
使用RecyclerView,首先我們需要依賴(lài)
compile 'com.android.support:recyclerview-v7:23.+'
項(xiàng)目結(jié)構(gòu):
項(xiàng)目結(jié)構(gòu)
主要是把選擇的存儲(chǔ)在HashMap記錄下來(lái),通知用eventbus發(fā)送。下面我們一步一步來(lái)實(shí)現(xiàn)這種效果.
方法如下
1、我們新建一個(gè)MainActivity 布局
public class MainActivity extends Activity { private RecyclerView recyclerView; private CheckBox checkbox; private TextView selected; private ListAdapter adapter; private EventBus event; private boolean isChange = false; private ArrayListlist = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); } private void initView() { event = EventBus.getDefault(); event.register(this); recyclerView = (RecyclerView) findViewById(R.id.recyclerview); checkbox = (CheckBox) findViewById(R.id.checkbox); selected = (TextView) findViewById(R.id.selected); } private void initData() { for (int i = 0; i < 20; i++) { Book model = new Book(); model.setId(i); model.setName("商品" + i); model.setDesc("描述" + i); list.add(model); } adapter = new ListAdapter(list, event); recyclerView.setHasFixedSize(true); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { try { HashMap map = new HashMap (); int count = 0; if (isChecked) { isChange = false; } for (int i = 0, p = list.size(); i < p; i++) { if (isChecked) { map.put(i, true); count++; } else { if (!isChange) { map.put(i, false); count = 0; } else { map = adapter.getMap(); count = map.size(); } } } selected.setText("已選" + count + "項(xiàng)"); adapter.setMap(map); } catch (Exception e) { e.printStackTrace(); } } }); adapter.setOnItemClickListener(new ListAdapter.ItemClickListener() { @Override public void onItemClick(RecyclerView.ViewHolder holder, int positon) { Log.e("onItemClick", "" + positon); } @Override public void onItemLongClick(final RecyclerView.ViewHolder holder, final int positon) { Log.e("onItemLongClick", "" + positon); } }); } public void onEventMainThread(SelectEvent event) { int size = event.getSize(); if (size < list.size()) { isChange = true; checkbox.setChecked(false); } else { checkbox.setChecked(true); isChange = false; } selected.setText("已選" + size + "項(xiàng)"); } @Override protected void onDestroy() { super.onDestroy(); event.unregister(this); } }
2、我們建一個(gè)ListAdapter適配器
public class ListAdapter extends RecyclerView.Adapter{ private List mItems; private List selected; public HashMap map; private EventBus eventBus; public ListAdapter(List mItems, EventBus eventBus) { this.mItems = mItems; this.eventBus = eventBus; map = new HashMap<>(); selected = new ArrayList<>(); init(); } private void init() { if (null == mItems || mItems.size() <= 0) { return; } for (int i = 0, p = mItems.size(); i < p; i++) { map.put(i, false); } } @Override public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_main_item, parent, false); ItemViewHolder itemViewHolder = new ItemViewHolder(view); return itemViewHolder; } @Override public void onBindViewHolder(final ItemViewHolder holder, final int position) { if (null == mItems || mItems.size() <= 0) { return; } holder.name.setText(mItems.get(position).getName()); holder.desc.setText(mItems.get(position).getDesc()); holder.checkBox.setTag(new Integer(position));//防止劃回來(lái)時(shí)選中消失 if (map != null) { ((ItemViewHolder) holder).checkBox.setChecked((map.get(position))); } else { ((ItemViewHolder) holder).checkBox.setChecked(false); } holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int mFlags = (Integer) view.getTag(); if (map != null) { if (map.get(position)) { map.put(position, false); eventBus.post(new SelectEvent(selected(map))); } else { map.put(mFlags, Boolean.TRUE); eventBus.post(new SelectEvent(selected(map))); } } } }); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mItemClickListener.onItemClick(holder,holder.getAdapterPosition()); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mItemClickListener.onItemLongClick(holder,holder.getAdapterPosition()); return true; } }); } private int selected(HashMap map) { int size = 0; for (Integer key : map.keySet()) { if(map.get(key)){ size++; } } return size; } @Override public int getItemCount() { return mItems == null? 0 :mItems.size(); } public static class ItemViewHolder extends RecyclerView.ViewHolder{ public final CheckBox checkBox; public final TextView name; public final TextView desc; public ItemViewHolder(View itemView) { super(itemView); checkBox = (CheckBox) itemView.findViewById(R.id.checkbox); name = (TextView) itemView.findViewById(R.id.tv_name); desc = (TextView) itemView.findViewById(R.id.tv_desc); } } public HashMap getMap() { return map; } public void setMap(HashMap map) { this.map = map; notifyDataSetChanged(); } /** * 點(diǎn)擊事件和長(zhǎng)按事件 */ public interface ItemClickListener{ void onItemClick(RecyclerView.ViewHolder holder , int position); void onItemLongClick(RecyclerView.ViewHolder holder , int position); } private ItemClickListener mItemClickListener; public void setOnItemClickListener(ItemClickListener listener){ this.mItemClickListener=listener; } }
3、我們新建實(shí)體Book和SelectEvent
package com.aikaifa.checkall.bean; public class Book { private int id; private String name; private String desc; public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Book() { } } public class SelectEvent { private int size; public SelectEvent(int size) { this.size = size; } public int getSize() { return size; } }
4、建立checkbox_selector.xml選中樣式
<?xml version="1.0" encoding="utf-8"?>
5、建立一個(gè)activity_main.xml布局
<?xml version="1.0" encoding="utf-8"?>
activity_main_item布局
這樣關(guān)于RecyclerView實(shí)現(xiàn)全選,ItemTouchHelper實(shí)現(xiàn)側(cè)滑刪除,拖拽功能就完成了。
示例代碼下載:
項(xiàng)目地址:https://github.com/88ios/RecyclerViewCheckAll
本地下載:點(diǎn)擊這里
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)各位Android開(kāi)發(fā)者們能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。