我们经常在列表的页面中,点击列表中的行,一般进入详情页面,长按列表中一行,会弹出一个菜单,包含了对某一行的操作(编辑、删除等等),也知道通常的用法:
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); } } }
有两个地方需要注意: |