Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.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 - Fatal编程技术网

Java RecyclerView项目选择引发错误

Java RecyclerView项目选择引发错误,java,android,android-recyclerview,Java,Android,Android Recyclerview,我试图在SelectionTracker的帮助下在RecyclerView中实现项目选择功能,但是获取IllegalArgumentException和stacktrace并不直观,因为它只显示元数据 这就是我如何建立追踪器 令人惊讶的是,我在Kotlin中实现了相同的代码,并且在那里工作得很好。我发现了一篇有类似问题的SO帖子,被接受的答案建议传递一个定制的ItemKeyProvider,而不是StableIdKeyProvider。因此,在这样做时,我犯了这个错误 Stacktrace 2

我试图在SelectionTracker的帮助下在RecyclerView中实现项目选择功能,但是获取IllegalArgumentException和stacktrace并不直观,因为它只显示元数据

这就是我如何建立追踪器

令人惊讶的是,我在Kotlin中实现了相同的代码,并且在那里工作得很好。我发现了一篇有类似问题的SO帖子,被接受的答案建议传递一个定制的ItemKeyProvider,而不是StableIdKeyProvider。因此,在这样做时,我犯了这个错误

Stacktrace 2

java.lang.IllegalArgumentException
        at androidx.core.util.Preconditions.checkArgument(Preconditions.java:38)
        at androidx.recyclerview.selection.DefaultSelectionTracker.anchorRange(DefaultSelectionTracker.java:269)
        at androidx.recyclerview.selection.MotionInputHandler.selectItem(MotionInputHandler.java:60)
        at androidx.recyclerview.selection.TouchInputHandler.onLongPress(TouchInputHandler.java:132)
        at androidx.recyclerview.selection.GestureRouter.onLongPress(GestureRouter.java:96)
        at android.view.GestureDetector.dispatchLongPress(GestureDetector.java:778)
        at android.view.GestureDetector.-wrap0(Unknown Source:0)
        at android.view.GestureDetector$GestureHandler.handleMessage(GestureDetector.java:293)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
java.lang.IllegalStateException: Two different ViewHolders have the same stable ID. Stable IDs in your adapter MUST BE unique and SHOULD NOT change.
     ViewHolder 1:ViewHolder{987472c position=1 id=-1, oldPos=-1, pLpos:-1} 
     View Holder 2:ViewHolder{e50e5f5 position=2 id=-1, oldPos=-1, pLpos:-1 not recyclable(1)} androidx.recyclerview.widget.RecyclerView{617d73 VFED..... .F....ID 42,42-1038,1542 #7f08007b app:id/recyclerview}, adapter:com.example.roomwordssample.WordAdapter@7ada430, layout:androidx.recyclerview.widget.GridLayoutManager@a15b8a9, context:com.example.roomwordssample.Main2Activity@ca1d275
        at androidx.recyclerview.widget.RecyclerView.handleMissingPreInfoForChangeError(RecyclerView.java:4058)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3982)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3652)
        at androidx.recyclerview.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1877)
        at androidx.recyclerview.widget.RecyclerView$1.run(RecyclerView.java:407)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
        at android.view.Choreographer.doCallbacks(Choreographer.java:723)
        at android.view.Choreographer.doFrame(Choreographer.java:655)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
更新的跟踪器

wordAdapter.tracker=new SelectionTracker.Builder(
“mySelectionId”,
回收视图,
新的GetItemDetails(recyclerView、ItemKeyProvider.SCOPE_映射),
新MyDetailsLookUp(回收视图),
StorageStrategy.createLongStorage()
).带选择谓词(
SelectionPredicates.createSelectAnything()的
).build();
CustomItemKeyProvider

类CustomItemKeyProvider扩展了ItemKeyProvider{
回收视图回收视图;
CustomItemKeyProvider(RecyclerView RecyclerView,int范围){
超级(范围);
this.recyclerView=recyclerView;
}
@可空
@凌驾
公共长getKey(int位置){
返回wordAdapter.getItemId(位置);
}
@凌驾
public int getPosition(@NonNull长键){
RecyclerView.ViewHolder ViewHolder=RecyclerView.findViewHolderForItemId(键);
return viewHolder==null?RecyclerView.NO_位置:viewHolder.getLayoutPosition();
}
}
注意:
wordAdapter.setHasStableIds(true)
在stacktrace中将适配器设置为
RecyclerView
之前完成:

java.lang.IllegalStateException: Two different ViewHolders have the same stable ID. Stable IDs in your adapter MUST BE unique and SHOULD NOT change.
     ViewHolder 1:ViewHolder{987472c **position=1 id=-1**, oldPos=-1, pLpos:-1} 
     View Holder 2:ViewHolder{e50e5f5 **position=2 id=-1**, oldPos=-1, pLpos:-1 not recyclable(1)} 
在上面的错误中,它表示列表中的位置1和位置2使用相同的ID,但必须是唯一的。要与选择跟踪器一起使用,请确保您具有唯一的id。 通知列表您有稳定的ID

setHasStableIds(true)

在RecyclerView.Adapter中,您需要确保为每个适配器使用唯一的

public abstract class WordAdapter extends RecyclerView.Adapter {
  private List<Item> itemsList = new ArrayList<>();
  //other override methods

  @Override
    public long getItemId(int position) {
        return position; // here each value must be unique either position or data unique id
    }
}
公共抽象类WordAdapter扩展了RecyclerView.Adapter{ 私有列表项列表=新的ArrayList(); //其他覆盖方法 @凌驾 公共长getItemId(int位置){ return position;//此处每个值必须是唯一的位置id或数据唯一id } } 在stacktrace中:

java.lang.IllegalStateException: Two different ViewHolders have the same stable ID. Stable IDs in your adapter MUST BE unique and SHOULD NOT change.
     ViewHolder 1:ViewHolder{987472c **position=1 id=-1**, oldPos=-1, pLpos:-1} 
     View Holder 2:ViewHolder{e50e5f5 **position=2 id=-1**, oldPos=-1, pLpos:-1 not recyclable(1)} 
在上面的错误中,它表示列表中的位置1和位置2使用相同的ID,但必须是唯一的。要与选择跟踪器一起使用,请确保您具有唯一的id。 通知列表您有稳定的ID

setHasStableIds(true)

在RecyclerView.Adapter中,您需要确保为每个适配器使用唯一的

public abstract class WordAdapter extends RecyclerView.Adapter {
  private List<Item> itemsList = new ArrayList<>();
  //other override methods

  @Override
    public long getItemId(int position) {
        return position; // here each value must be unique either position or data unique id
    }
}
公共抽象类WordAdapter扩展了RecyclerView.Adapter{ 私有列表项列表=新的ArrayList(); //其他覆盖方法 @凌驾 公共长getItemId(int位置){ return position;//此处每个值必须是唯一的位置id或数据唯一id } }
由于适配器具有稳定的id,它必须为每个适配器位置返回唯一的id。现在如何返回该Id?由于适配器具有稳定的Id,它必须为每个适配器位置返回唯一的Id。你现在如何归还身份证?
class CustomItemKeyProvider extends ItemKeyProvider<Long> {
        RecyclerView recyclerView;

        CustomItemKeyProvider(RecyclerView recyclerView, int scope) {
            super(scope);
            this.recyclerView = recyclerView;
        }

        @Nullable
        @Override
        public Long getKey(int position) {
            return wordAdapter.getItemId(position);
        }

        @Override
        public int getPosition(@NonNull Long key) {
            RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForItemId(key);
            return viewHolder == null ? RecyclerView.NO_POSITION : viewHolder.getLayoutPosition();
        }
    }
java.lang.IllegalStateException: Two different ViewHolders have the same stable ID. Stable IDs in your adapter MUST BE unique and SHOULD NOT change.
     ViewHolder 1:ViewHolder{987472c **position=1 id=-1**, oldPos=-1, pLpos:-1} 
     View Holder 2:ViewHolder{e50e5f5 **position=2 id=-1**, oldPos=-1, pLpos:-1 not recyclable(1)} 
public abstract class WordAdapter extends RecyclerView.Adapter {
  private List<Item> itemsList = new ArrayList<>();
  //other override methods

  @Override
    public long getItemId(int position) {
        return position; // here each value must be unique either position or data unique id
    }
}