RecyclerView添加长按的两种方式
第一种 添加Menu的方式
从RecyclerView的Adapter入手,在Adapter的ViewHolder中为每个itemView设置setOnLongClickListener监听,然后在长按监听回调中设置当前的position,为每个itemView设置setOnCreateContextMenuListener监听,通过上面记录的position来执行相应的动作。
在adapter中添加系列方法,Activity中只需要重载onContextItemSelected(MenuItem item)就行了
public class MainActivity extends AppCompatActivity {
private BiJiAdapter adapter;
private BiJiDAO dao;
private List<BiJiBean> data;
private RecyclerView mRecyclerView;
private int position;
public class BiJiAdapter extends RecyclerView.Adapter<BiJiAdapter.ViewHolder> {
private int adapterPosition;
public void setContextMenuPosition(int position) {
adapterPosition = position;
}
BiJiAdapter() {
}
@Override
public int getItemCount() {
return data.size();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, null);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.mTextView.setText(new StringBuilder(String.valueOf(position))
.append(". ")
.append(((BiJiBean) MainActivity.this.data.get(position)).getInfo())
.toString());
//设置长按监听
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//保存当前 item 的 position
setContextMenuPosition(holder.getLayoutPosition());
Log.d("lixiongjun","onLongClick");
Log.d("lixiongjun","holder.getLayoutPosition():" + holder.getLayoutPosition());
return false;
}
});
}
//在 onViewRecycled 方法中移除 OnLongClickListener 监听
@Override
public void onViewRecycled(ViewHolder holder) {
holder.itemView.setOnLongClickListener(null);
Log.d("lixiongjun","onViewRecycled");
super.onViewRecycled(holder);
}
// 长按,实现OnCreateContextMenuListener
class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
private TextView mTextView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
mTextView = itemView.findViewById(android.R.id.text1);
itemView.setOnCreateContextMenuListener(this);
}
//添加长按的Menu
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.setHeaderTitle("我的笔记呀");
menu.add(0, 1, 0, "更新");
menu.add(0, 2, 0, "删除");
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Window window = getWindow();
window.requestFeature(Window.FEATURE_LEFT_ICON);
setContentView(R.layout.activity_main);
window.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_launcher_background);
mRecyclerView = findViewById(R.id.recycler);
DividerItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
//设置RecyclerView 灰色 分割线
// itemDecoration.setDrawable(new ColorDrawable(ContextCompat.getColor(this, R.color.black)));
//添加drawable,设置彩色分割线
itemDecoration.setDrawable(ContextCompat.getDrawable(this, R.drawable.shape_rectangle));
mRecyclerView.addItemDecoration(itemDecoration);
this.dao = new BiJiDAO(this);
this.data = this.dao.queryAll();
this.adapter = new BiJiAdapter();
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(this.adapter);
}
//重现,长按监听的接口方法
@Override
public boolean onContextItemSelected(MenuItem item) {
Log.d("lixiongjun","onContextItemSelected");
BiJiBean biJiBean = (BiJiBean) this.data.get(position);
switch (item.getItemId()) {
case 1:
showUpdateDialog(biJiBean);
break;
case 2:
this.dao.deleteById(biJiBean.getId());
this.data.remove(this.position);
this.adapter.notifyDataSetChanged();
break;
}
return super.onContextItemSelected(item);
}
/**
* 跟recyclerView长按无关
* 更新Dialog
*
* @param biJiBean
*/
private void showUpdateDialog(final BiJiBean biJiBean) {
final EditText editText = new EditText(this);
editText.setText(biJiBean.getInfo());
new AlertDialog.Builder(this)
.setTitle("更新笔记")
.setView(editText)
.setPositiveButton("更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
biJiBean.setInfo(editText.getText().toString());
MainActivity.this.dao.update(biJiBean);
MainActivity.this.adapter.notifyDataSetChanged();
}
}).setNegativeButton("取消", null).show();
}
/**
* 跟recyclerView长按无关
* 添加笔记Dialog
* @param v
*/
public void add(View v) {
final EditText editText = new EditText(this);
editText.setHint("笔记输入");
new AlertDialog.Builder(this)
.setTitle("添加笔记")
.setView(editText)
.setPositiveButton("添加", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
BiJiBean biJiBean = new BiJiBean(-1, editText.getText().toString());
MainActivity.this.dao.add(biJiBean);
MainActivity.this.data.add(0, biJiBean);
MainActivity.this.adapter.notifyDataSetChanged();
}
}).setNegativeButton("取消", null).show();
}
}
第二种 RecyclerView设置监听回调方式
在Adapter中写一个item的点击事件接口,Adapter中设置该接口,并给其一个set方法.Adapter类实现 View.OnClickListener, View.OnLongClickListener接口,并实现其方法。实现接口的方法中,回调item的点击事件接口,在Activity中调用方法.
public class MainActivity extends AppCompatActivity {
private BiJiAdapter adapter;
private BiJiDAO dao;
private List<BiJiBean> data;
private RecyclerView mRecyclerView;
private int position;
public class BiJiAdapter extends RecyclerView.Adapter<BiJiAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener {
BiJiAdapter() {
}
@Override
public int getItemCount() {
return data.size();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, null);
ViewHolder holder = new ViewHolder(view);
// view.setTag(android.R.id.text1, holder);//注意这里,对应values/ids.xml里的value
view.setTag(1111111111, holder);//注意这里,对应values/ids.xml里的value
view.setOnClickListener(this);
view.setOnLongClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.mTextView.setText(new StringBuilder(String.valueOf(position))
.append(". ")
.append(((BiJiBean) MainActivity.this.data.get(position)).getInfo())
.toString());
}
class ViewHolder extends RecyclerView.ViewHolder {
private TextView mTextView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
mTextView = itemView.findViewById(android.R.id.text1);
}
}
@Override
public void onClick(View view) {
//回调点击事件
ViewHolder holder = (ViewHolder) view.getTag(1111111111);
if (mOnItemClickListener != null) {
this.mOnItemClickListener.onItemClick(view, holder.getAdapterPosition());
}
}
@Override
public boolean onLongClick(View view) {
//回调长按事件
ViewHolder holder = (ViewHolder) view.getTag(1111111111);
if (mOnItemClickListener != null) {
this.mOnItemClickListener.onItemLongClick(view, holder.getAdapterPosition());
}
return false;
}
private OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener mOnItemClickLitener) {
this.mOnItemClickListener = mOnItemClickLitener;
}
}
//自定义点击接口类
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Window window = getWindow();
window.requestFeature(Window.FEATURE_LEFT_ICON);
setContentView(R.layout.activity_main);
window.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_launcher_background);
mRecyclerView = findViewById(R.id.recycler);
DividerItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
//设置灰色 分割线
// itemDecoration.setDrawable(new ColorDrawable(ContextCompat.getColor(this, R.color.black)));
//设置彩色
itemDecoration.setDrawable(ContextCompat.getDrawable(this, R.drawable.shape_rectangle));
mRecyclerView.addItemDecoration(itemDecoration);
this.dao = new BiJiDAO(this);
this.data = this.dao.queryAll();
this.adapter = new BiJiAdapter();
adapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
//单击事件
Toast.makeText(MainActivity.this, "点击item", Toast.LENGTH_LONG).show();
}
@Override
public void onItemLongClick(View view, final int position) {
//长按事件,弹窗
BiJiBean biJiBean = data.get(position);
final String[] items = {"更新", "删除"};
android.app.AlertDialog.Builder listDialog = new android.app.AlertDialog.Builder(MainActivity.this);
listDialog.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i) {
case 0://更新item
showUpdateDialog(biJiBean);
break;
case 1://删除item
dao.deleteById(biJiBean.getId());
data.remove(position);
adapter.notifyDataSetChanged();
break;
default:
break;
}
}
});
listDialog.show();
}
});
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(this.adapter);
}
private void showUpdateDialog(final BiJiBean biJiBean) {
final EditText editText = new EditText(this);
editText.setText(biJiBean.getInfo());
new AlertDialog.Builder(this)
.setTitle("更新笔记")
.setView(editText)
.setPositiveButton("更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
biJiBean.setInfo(editText.getText().toString());
MainActivity.this.dao.update(biJiBean);
MainActivity.this.adapter.notifyDataSetChanged();
}
}).setNegativeButton("取消", null).show();
}
public void add(View v) {
final EditText editText = new EditText(this);
editText.setHint("笔记输入");
new AlertDialog.Builder(this)
.setTitle("添加笔记")
.setView(editText)
.setPositiveButton("添加", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
BiJiBean biJiBean = new BiJiBean(-1, editText.getText().toString());
MainActivity.this.dao.add(biJiBean);
MainActivity.this.data.add(0, biJiBean);
MainActivity.this.adapter.notifyDataSetChanged();
}
}).setNegativeButton("取消", null).show();
}
}
参考: RecyclerView添加ContextMenu的两种方案详解.
参考: Android中RecyclerView的长按.