为了账号安全,请及时绑定邮箱和手机立即绑定

RecyclerView 如何实现长按、多选、单击

标签:
Android

众所周知RecyclerView是androidv7包下的控件,比listview的灵活度高,但是RecyclerView并未提供多选,长按的、单击的功能,这些功能需要我们自己去实现,这就导致要实现多选就比较麻烦。

import android.app.Activity;

import android.content.Context;

import android.graphics.Color;

import android.support.v7.widget.CardView;

import android.support.v7.widget.RecyclerView;

import android.support.v7.widget.RecyclerView.ViewHolder;

import android.view.ActionMode;

import android.view.View;

import android.view.ViewGroup;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

/**

 * weiheng.li 

 */

public abstract class BaseAdapter<T> extends RecyclerView.Adapter<ViewHolder> {

    protected List<T> data;

    protected Context context;

    protected ActionMode mode;

    protected OnItemClickListener mOnItemClickListener;

    protected MultiChoiceModeListener multiChoiceModeListener;

    protected boolean IsChoiceModeL = false;//是否显示多选按钮

    protected Set<Integer> selectedPositionSet = new HashSet<Integer>() {

    };

    public void setData(List<T> data) {

        this.data = data;

    }

    public List<T> getData() {

        return data;

    }

    public Set<Integer> getSelectedPositionSet() {

        return selectedPositionSet;

    }

    public void setMultiChoiceModeListener(Context context, MultiChoiceModeListener multiChoiceModeListener) {

        this.multiChoiceModeListener = multiChoiceModeListener;

    }

    public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) {

        this.mOnItemClickListener = mOnItemClickListener;

    }

    @Override

    public abstract ViewHolder onCreateViewHolder(ViewGroup parent, int viewType);

    @Override

    public void onBindViewHolder(final ViewHolder holder, final int position) {

        if (selectedPositionSet.contains(position))

            ((CardView) holder.itemView).setCardBackgroundColor(Color.DKGRAY);

        else

            ((CardView) holder.itemView).setCardBackgroundColor(Color.WHITE);

        if (mOnItemClickListener != null) {

            holder.itemView.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View v) {

                    if (!IsChoiceModeL) {

                        //不为多选

                        mOnItemClickListener.onItemClick(holder.itemView, position);

                    } else {

                        if (multiChoiceModeListener != null) {

                            boolean select = IsAddSelected(position);

                            if (selectedPositionSet.size() > 0) {

                                multiChoiceModeListener.onItemCheckedStateChanged(mode, position, select);

                                BaseAdapter.this.notifyDataSetChanged();

                            } else {

                                mode.finish();//取消

                            }

                        }

                    }

                }

            });

            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {

                @Override

                public boolean onLongClick(View v) {

                    if (multiChoiceModeListener != null && IsChoiceModeL == false) {

                        mode = ((Activity) context).startActionMode(multiChoiceModeListener);

                        IsChoiceModeL = true;

                        multiChoiceModeListener.onItemCheckedStateChanged(mode, position, IsAddSelected(position));

                        BaseAdapter.this.notifyDataSetChanged();

                    } else {

                        mOnItemClickListener.onItemLongClick(holder.itemView, position);

                    }

                    return false;

                }

            });

        }

    }

    public BaseAdapter(Context context, List<T> data) {

        this.data = data;

        this.context = context;

    }

    @Override

    public int getItemCount() {

        return data.size();

    }

    public ActionMode getMode() {

        return mode;

    }

    public boolean isChoiceModeL() {

        return IsChoiceModeL;

    }

    private boolean IsAddSelected(int namePosition) {

        if (selectedPositionSet.contains(namePosition)) {

            selectedPositionSet.remove(namePosition);

            return false;

        } else {

            selectedPositionSet.add(namePosition);

            return true;

        }

    }

    /**

     * 全部选中

     */

    public void allSelected() {

        this.selectedPositionSet.clear();

        for (int i = 0; i < data.size(); i++)

            selectedPositionSet.add(i);

        this.notifyDataSetChanged();

    }

    /**

     * 取消选中

     */

    public void cancelSelected() {

        IsChoiceModeL = false;

        this.selectedPositionSet.clear();

        this.notifyDataSetChanged();

    }

    public interface OnItemClickListener {

        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);

    }

    public interface MultiChoiceModeListener extends ActionMode.Callback {

        public void onItemCheckedStateChanged(ActionMode mode,

                                              int position, boolean checked);

    }

}

子类实现方式

import android.content.Context;

import android.support.v7.widget.RecyclerView;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;

import com.hengjiatech.waterpatrolapp.R;

import com.hengjiatech.waterpatrolapp.model.PatrolRecord;

import com.lidroid.xutils.ViewUtils;

import com.lidroid.xutils.view.annotation.ViewInject;

import java.util.List;

/**

 * Created by HengJiaTech_7 on 2016/5/3 0003.

 */

public class TestAdapter extends BaseAdapter<PatrolRecord> {

    @Override

    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        myViewHolder holder = new myViewHolder(LayoutInflater.from(

                context).inflate(R.layout.record_item, parent,

                false));

        return holder;

    }

    @Override

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        PatrolRecord p = data.get(position);

        myViewHolder mholder = ((myViewHolder) holder);

        mholder.titleTv.setText(p.getTitle());

        mholder.descriptionTv.setText(p.getDescriptionDisplay());

        mholder.personTv.setText(p.getPersons());

        mholder.startTimeTv.setText(p.getStartTimeDisplay());

        super.onBindViewHolder(mholder, position);

    }

    public TestAdapter(Context context, List<PatrolRecord> data) {

        super(context, data);

    }

    class myViewHolder extends RecyclerView.ViewHolder {

        @ViewInject(R.id.title_tv)

        TextView titleTv;

        @ViewInject(R.id.description_tv)

        TextView descriptionTv;

        @ViewInject(R.id.persons_tv)

        TextView personTv;

        @ViewInject(R.id.start_time_tv)

        TextView startTimeTv;

        public myViewHolder(View view) {

            super(view);

            ViewUtils.inject(this, view);

        }

    }

}

Activity实现

package com.hengjiatech.waterpatrolapp.uitl;

import android.app.Activity;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.os.Bundle;

import android.support.v7.app.ActionBar;

import android.support.v7.app.AlertDialog;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.DefaultItemAnimator;

import android.support.v7.widget.LinearLayoutManager;

import android.support.v7.widget.RecyclerView;

import android.view.ActionMode;

import android.view.Menu;

import android.view.MenuInflater;

import android.view.MenuItem;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.SpinnerAdapter;

import android.widget.Toast;

import com.hengjiatech.waterpatrolapp.PatrolRecordListQueryActivity;

import com.hengjiatech.waterpatrolapp.PatrolRecordManager;

import com.hengjiatech.waterpatrolapp.PatrolRecordSingleActivity;

import com.hengjiatech.waterpatrolapp.R;

import com.hengjiatech.waterpatrolapp.model.PatrolRecord;

import com.hengjiatech.waterpatrolapp.model.RecordQueryExpression;

import com.hengjiatech.waterpatrolapp.view.SpaceItemDecoration;

import com.lidroid.xutils.ViewUtils;

import com.lidroid.xutils.view.annotation.ContentView;

import com.lidroid.xutils.view.annotation.ViewInject;

import com.lidroid.xutils.view.annotation.event.OnClick;

import java.util.ArrayList;

import java.util.List;

@ContentView(R.layout.record_list)

public class TestListActivity extends AppCompatActivity {

    @ViewInject(R.id.id_recyclerview)

    private RecyclerView mRecyclerView;

    private TestAdapter patrolRecordAdapter;

    private static final int REQUEST_CODE_UPDATE_RECORD = 100;

    private static final int REQUEST_CODE_ADD_RECORD = 101;

    private static final int REQUEST_CODE_QUERY_RECORD = 102;

    private List<PatrolRecord> selectItem = new ArrayList<PatrolRecord>();

    private int catalog = PatrolRecord.CATALOG_ALL;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        ViewUtils.inject(this);

    

        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        mRecyclerView.setItemAnimator(new DefaultItemAnimator());

        mRecyclerView.addItemDecoration(new SpaceItemDecoration(30));

        patrolRecordAdapter = new TestAdapter(this, new ArrayList<PatrolRecord>());

        patrolRecordAdapter.setOnItemClickListener(new TestAdapter.OnItemClickListener() {

            @Override

            public void onItemClick(View view, int position) {

                

            }

            @Override

            public void onItemLongClick(View view, int position) {

            }

        });

        patrolRecordAdapter.setMultiChoiceModeListener(this, new TestAdapter.MultiChoiceModeListener() {

            @Override

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {

                MenuInflater inflater = mode.getMenuInflater();

                inflater.inflate(R.menu.menu_record_delete, menu);

                return true;

            }

            @Override

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {

                return false;

            }

            @Override

            public boolean onActionItemClicked(final ActionMode mode, MenuItem item) {

                int id = item.getItemId();

                if (id == R.id.action_delete) {

                    if (selectItem.size() > 0) {

                        AlertDialog.Builder builder = new AlertDialog.Builder(TestListActivity.this);

                        builder.setMessage(String.format("是否删除这%d项内容?", selectItem.size()));

                        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

                            @Override

                            public void onClick(DialogInterface dialogInterface, int i) {

                                patrolRecordAdapter.getData().removeAll(selectItem);

                                mode.finish();

                            }

                        });

                        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

                            @Override

                            public void onClick(DialogInterface dialogInterface, int i) {

                                mode.finish();

                                dialogInterface.dismiss();

                            }

                        });

                        builder.show();

                    } else {

                        Toast.makeText(TestListActivity.this, "当前无删除项!", Toast.LENGTH_SHORT).show();

                        mode.finish();

                    }

                } else if (id == R.id.action_cancel) {

                    mode.finish();

                } else if (id == R.id.action_check_all) {

                    //全选

                    selectItem.clear();

                    selectItem.addAll(patrolRecordAdapter.getData());

                    patrolRecordAdapter.allSelected();

                }

                return true;

            }

            @Override

            public void onDestroyActionMode(ActionMode mode) {

                //ActionMode 消失时执行

                notifyDataSetChanged();

            }

            @Override

            public void onItemCheckedStateChanged(ActionMode mode, int position, boolean checked) {

//                System.out.println(String.format("position =%d title=%s  ", position, patrolRecordAdapter.getPatrolRecord(position).getTitle()) + checked);

                if (checked) {

                    selectItem.add(patrolRecordAdapter.getData().get(position));

                } else {

                    selectItem.remove(patrolRecordAdapter.getData().get(position));

                }

                System.out.println(String.format("size=%d   >>", selectItem.size()));

            }

        });

        mRecyclerView.setAdapter(patrolRecordAdapter);

        catalog = getIntent().getIntExtra("catalog", PatrolRecordManager.CATALOG_ALL);

        actionBar.setSelectedNavigationItem(catalog);

    }

    public void notifyDataSetChanged() {

        System.out.println("删除size," + selectItem.size() + "selectsize=" + patrolRecordAdapter.selectedPositionSet.size());

        selectItem.clear();

        patrolRecordAdapter.cancelSelected();

    }

   

}

原文链接:http://www.apkbus.com/blog-613235-60434.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消