| 我们经常在列表的页面中,点击列表中的行,一般进入详情页面,长按列表中一行,会弹出一个菜单,包含了对某一行的操作(编辑、删除等等),也知道通常的用法: 
 
package com.lbrant.phone.view;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ContextMenu;
import android.view.View;
/**
 * 作者:dell
 * 时间:2015/11/3 18:34
 * 文件:PhoneRecorder
 * 描述:
 */
public class ContextMenuRecyclerView extends RecyclerView {
    private static final String LOG_TAG = "ContextMenuRecyclerView";
    private RecyclerContextMenuInfo mContextMenuInfo = new RecyclerContextMenuInfo();
    public ContextMenuRecyclerView(Context context) {
        super(context);
    }
    public ContextMenuRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public ContextMenuRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    protected ContextMenu.ContextMenuInfo getContextMenuInfo() {
        return mContextMenuInfo;
    }
    @Override
    public boolean showContextMenuForChild(View originalView) {
        Log.d(LOG_TAG, "showContextMenuForChild");
        Object tag = originalView.getTag();
        if (tag instanceof RecyclerItemMarker) {
            mContextMenuInfo.mRecycleItemMarker = (RecyclerItemMarker) tag;
        }
        return super.showContextMenuForChild(originalView);
    }
    public static class RecyclerItemMarker {
        public final int position;
        public final Object obj;
        public RecyclerItemMarker(int position, Object obj) {
            this.position = position;
            this.obj = obj;
        }
    }
    public static class RecyclerContextMenuInfo implements ContextMenu.ContextMenuInfo {
        public RecyclerItemMarker mRecycleItemMarker;
    }
}
    private class RecordRecycleViewAdapter extends RecyclerView.Adapter<RecordRecycleViewAdapter.RecordViewHolder> {
        private Cursor mCallRecordCursor;
        private int mIdIndex;
        private int mPhoneNumberIndex;
        private int mCallTimeIndex;
        private int mDurationIndex;
        private int mPathIndex;
        public RecordRecycleViewAdapter(Cursor cursor) {
            mCallRecordCursor = cursor;
            updateCursorColumnIndex();
        }
        private void updateCursorColumnIndex() {
            if (mCallRecordCursor != null) {
                mIdIndex = mCallRecordCursor.getColumnIndex(BaseDatabaseHelper.RECORDS_COLUMNS._ID);
                mPhoneNumberIndex = mCallRecordCursor.getColumnIndex(BaseDatabaseHelper.RECORDS_COLUMNS.NUMBER);
                mCallTimeIndex = mCallRecordCursor.getColumnIndex(BaseDatabaseHelper.RECORDS_COLUMNS.CALL_TIME);
                mDurationIndex = mCallRecordCursor.getColumnIndex(BaseDatabaseHelper.RECORDS_COLUMNS.DURATION);
                mPathIndex = mCallRecordCursor.getColumnIndex(BaseDatabaseHelper.RECORDS_COLUMNS.PATH);
            }
        }
        @Override
        public RecordRecycleViewAdapter.RecordViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View contentView = LayoutInflater.from(parent.getContext()).inflate(R.layout.record_list_item, parent, false);
            RecordViewHolder viewHolder = new RecordViewHolder(contentView);
            return viewHolder;
        }
        @Override
        public void onBindViewHolder(RecordRecycleViewAdapter.RecordViewHolder holder, final int position) {
            holder.itemView.setLongClickable(true);
            if (mCallRecordCursor != null && mCallRecordCursor.moveToPosition(position)) {
                long id = mCallRecordCursor.getLong(mIdIndex);
                String phoneNumber = mCallRecordCursor.getString(mPhoneNumberIndex);
                long seconds = mCallRecordCursor.getLong(mDurationIndex);
                String callTime = mCallRecordCursor.getString(mCallTimeIndex);
                String path = mCallRecordCursor.getString(mPathIndex);
                String duration = String.format("%1$02d:%2$02d:%3$02d", seconds / 3600, seconds % 3600 / 60, seconds % 60);
                RecordInfo info = new RecordInfo();
                info.setId(id);
                info.setPhoneNumber(phoneNumber);
                info.setSecondsDuration(seconds);
                info.setCallTime(callTime);
                info.setPath(path);
                holder.itemView.setTag(new ContextMenuRecyclerView.RecyclerItemMarker(position, info));
                holder.mTextViewPhoneNumber.setText(phoneNumber);
                holder.mTextViewDuration.setText(duration);
                holder.mTextviewCallTime.setText(callTime);
                Cursor cursor = queryContactByPhoneNumber(ContactsContract.CommonDataKinds.Phone.NUMBER + " = '" + phoneNumber + "'");
                if (cursor != null) {
                    if (cursor.moveToNext()) {
                        long contactId = cursor.getInt(0);
                        Cursor contactCursor = queryContact(ContactsContract.Contacts._ID + "=" + contactId);
                        if (contactCursor != null) {
                            holder.mTextViewName.setText(contactCursor.getString(1));
                            contactCursor.close();
                        }
                    }
                    cursor.close();
                }
            }
        }
        @Override
        public void onViewRecycled(RecordViewHolder holder) {
            super.onViewRecycled(holder);
            holder.itemView.setOnCreateContextMenuListener(null);
        }
        @Override
        public int getItemCount() {
            return mCallRecordCursor == null ? 0 : mCallRecordCursor.getCount();
        }
        public void changeCursor(Cursor cursor) {
            if (cursor != mCallRecordCursor) {
                if (mCallRecordCursor != null) {
                    mCallRecordCursor.close();
                }
                mCallRecordCursor = cursor;
                updateCursorColumnIndex();
                notifyDataSetChanged();
            }
        }
        public class RecordViewHolder extends RecyclerView.ViewHolder {
            private ImageView mImageViewAvatar;
            private TextView mTextViewPhoneNumber;
            private TextView mTextViewName;
            private TextView mTextviewCallTime;
            private TextView mTextViewDuration;
            public RecordViewHolder(View itemView) {
                super(itemView);
                mImageViewAvatar = (ImageView) itemView.findViewById(R.id.imageViewAvatar);
                mTextViewName = (TextView) itemView.findViewById(R.id.textViewName);
                mTextViewPhoneNumber = (TextView) itemView.findViewById(R.id.textViewPhoneNumber);
                mTextviewCallTime = (TextView) itemView.findViewById(R.id.textViewCallTime);
                mTextViewDuration = (TextView) itemView.findViewById(R.id.textViewDuration);
            }
        }
    }
	有两个地方需要注意: | 




 shopex红色综合批发商城
							人气:642
							shopex红色综合批发商城
							人气:642
						 Logancee多用途外贸服饰鞋包
							人气:435
							Logancee多用途外贸服饰鞋包
							人气:435
						 ecshop佳品网2012模板
							人气:2501
							ecshop佳品网2012模板
							人气:2501
						 ecshop爱玛模板
							人气:571
							ecshop爱玛模板
							人气:571
						 ecshop仿好乐买模板|ecshop鞋
							人气:712
							ecshop仿好乐买模板|ecshop鞋
							人气:712
						 Universal 英文综合类商城
							人气:271
							Universal 英文综合类商城
							人气:271