Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过长时间单击recyclerview正确创建对话框警报?_Java_Android_Android Recyclerview_Listener - Fatal编程技术网

Java 通过长时间单击recyclerview正确创建对话框警报?

Java 通过长时间单击recyclerview正确创建对话框警报?,java,android,android-recyclerview,listener,Java,Android,Android Recyclerview,Listener,我的问题可能看起来很特别,但我需要您帮助我如何为recyclerview的每个元素创建对话框 事实上,我的片段包含一个包含X元素的循环视图,我希望,当用户长时间按下其中一个元素时,会打开一个对话框,询问他“您确定要删除此元素吗?”以及两个按钮“是”和“取消” 我已经成功地做到了这一点,但我特别想知道我的方法是否正确,以避免获得糟糕的编程反应 @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder

我的问题可能看起来很特别,但我需要您帮助我如何为recyclerview的每个元素创建对话框

事实上,我的片段包含一个包含X元素的循环视图,我希望,当用户长时间按下其中一个元素时,会打开一个对话框,询问他“您确定要删除此元素吗?”以及两个按钮“是”和“取消”

我已经成功地做到了这一点,但我特别想知道我的方法是否正确,以避免获得糟糕的编程反应

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
   PlaceViewHolder Pholder =(PlaceViewHolder) holder;
   Glide.with(mContext)
        .load(mPhotoList.get(position))
        .fitCenter()
        .into(((PlaceViewHolder) holder).mPlace);

   Pholder.mPlace.setOnClickListener(new View.OnClickListener(){
       @Override
       public void onClick(View v){
            switchContext(mPhotoList.get(position));
       }
   });

   Pholder.mPlace.setOnLongClickListener(new View.OnLongClickListener() {
       @Override
       public boolean onLongClick(View view) {
           new MaterialAlertDialogBuilder(mContext)
                   .setTitle(R.string.profile_photos_dialog_box_title)
                   .setMessage(R.string.profile_photos_dialog_box_message)

                   // Specifying a listener allows you to take an action before dismissing the dialog.
                   // The dialog is automatically dismissed when a dialog button is clicked.
                   .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int which) {
                           // Continue with delete operation
                       }
                   })

                   // A null listener allows the button to dismiss the dialog and take no further action.
                   .setNegativeButton(android.R.string.no, null)
                   .setIcon(android.R.drawable.ic_dialog_alert)
                   .show();
           return true;
       }

   });
}
如您所见,每次调用onBindViewHolder时,我都会添加一个onClick listen,我就是在最后一个对话框中创建的


此外,由于我的信息总是相同的,即使我发现这个菜单的格式不太适合选择和可能的操作,我是否应该使用上下文菜单?

老实说,我不确定“最佳实践”可能是什么,但我以前做过。我是如何做到这一点的,我没有在
onBindViewHolder
中的longclick处理程序中创建对话框并执行操作,而是创建了一个自定义侦听器界面,以便通过 将相关数据返回给调用者。像这样:

MyListListener

公共接口MyListListener{
//其中“index”可以是项的索引,也可以是列表项在“index”处表示的对象
长压无效(整数指数);
}
我将把它传递到自定义
RecyclerView.Adapter的构造函数中,如下所示:

MyAdapter

公共类MyAdapter扩展。。。{
私人监听;
公共MyAdapter(MyListListener侦听器){
this.listener=listener;
}
}
然后在内部
onBindViewHolder
MyAdapter/ViewHolder onBindViewHolder

Pholder.mPlace.setOnLongClickListener(新建)
View.OnLongClickListener(){
@凌驾
仅长按公共布尔值(视图){
listener.onitmlong按下(位置);
}
});
然后我的片段或活动将实现侦听器接口:

MyActivity

公共类MyActivity扩展。。。实现MyListListener{
@凌驾
已按下的公共空格(整数索引){
//显示对话框并执行操作
}
} 

我个人喜欢这样,因为这意味着我的适配器更加孤立。除了展示一系列的东西,他们没有做什么。这些“东西”背后的逻辑最终存在于别处。通过这种方式进行单元测试也更容易,因为您可以模拟监听器界面。

感谢您提供的详细答案!我真的很喜欢你的解决方案,但是,我的解决方案是像“反模式”还是禁止??我真的不知道该怎么想我的解决方案。问题是,这两个都已经是监听器了——人们基本上可以按原样注册它们;这里的这种方法只是将项索引添加到接口方法中(记录的ID通常比索引更相关,但更新适配器需要索引)。@MartinZeitler是的,谢谢。我更新了答案的第一部分,说我创建了一个自定义侦听器接口,这样我就可以将相关数据传递回调用方。@Quentin我不确定你的方法是否被视为反模式,但为了不让列表中显示的数据发生了什么的细节,我更喜欢我的方法,所以列表的工作只是显示一个事物列表。@MattU当模式是“职责分离”时。。。在适配器中添加大量代码是一种反模式。