Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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 视图隐藏时,回收器视图未取消选择_Java_Android_Android Recyclerview - Fatal编程技术网

Java 视图隐藏时,回收器视图未取消选择

Java 视图隐藏时,回收器视图未取消选择,java,android,android-recyclerview,Java,Android,Android Recyclerview,我有一个显示四个数字的回收器视图。1,2,3,4. 当我选择其中任何一个数字时,一切似乎都很好。问题是当我水平滚动时,其他数字填充我的屏幕:4,5,6,7 状态1 State2 在本例中,在状态1和状态2之间来回滚动,当只应选择其中一个时,7和1都被选中 问题:如何使单击其中一个数字可以取消选择屏幕上看不到的数字 适配器: public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ pr

我有一个显示四个数字的回收器视图。1,2,3,4. 当我选择其中任何一个数字时,一切似乎都很好。问题是当我水平滚动时,其他数字填充我的屏幕:4,5,6,7

状态1

State2

在本例中,在状态1和状态2之间来回滚动,当只应选择其中一个时,7和1都被选中

问题:如何使单击其中一个数字可以取消选择屏幕上看不到的数字

适配器:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
private String[] days;
private String[] numbers;
SelectionTracker<Long> mSelectionTracker;
private static MyAdapter myAdapter;


public MyAdapter(String[] day, String[] number){
    days = day;
    numbers = number;
    setHasStableIds(true);
}


//Set Keys
public void setSelectionTracker(SelectionTracker<Long> selectionTracker) {
    mSelectionTracker = selectionTracker;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    String dayInit = days[position];
    String numberInit = numbers[position];
    Long id = getItemId(position);


    boolean isSelected = false;
    if(mSelectionTracker != null) {
        if (mSelectionTracker.isSelected(id)) {
            isSelected = true;
        }
    }


    holder.bind(position, id, dayInit, numberInit, isSelected);
}

public static class MyViewHolder extends RecyclerView.ViewHolder{
    public TextView dayView, numberView;
    public View view;
    ScheduleDetails scheduleDetails = new ScheduleDetails();

    public MyViewHolder(View itemView){
        super(itemView);
        view = itemView;
        dayView = itemView.findViewById(R.id.day);
        numberView = itemView.findViewById(R.id.day_number);

    }

    void bind(int position, Long key, String dayInit, String numberInit, Boolean isSelected){
        scheduleDetails.position = position;
        scheduleDetails.identifier = key;

        System.out.println("Check: " + position);

        dayView.setText(dayInit);
        numberView.setText(numberInit);
        view.setActivated(isSelected);
    }


    public ItemDetailsLookup.ItemDetails<Long> getItemDetails(@NonNull MotionEvent motionEvent){
        return scheduleDetails;
    }
}

static class ScheduleDetails extends ItemDetailsLookup.ItemDetails<Long>{
    int position;
    Long identifier;

    @Override
    public int getPosition() {
        return position;
    }

    @Nullable
    @Override
    public Long getSelectionKey() { return identifier; }

    @Override
    public boolean inSelectionHotspot(@NonNull MotionEvent e){
        return true;
    }
}

// Create new views (invoked by the layout manager)
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.recycler_layout, parent, false);

    MyViewHolder vh = new MyViewHolder(view);
    return vh;
}


@Override
public int getItemCount() {
    return days.length;
}

@Override
public long getItemId(int position) {
    return position;
}
公共类MyAdapter扩展了RecyclerView.Adapter{ 私人字符串[]天; 私有字符串[]个数字; 选择跟踪器mSelectionTracker; 私有静态MyAdapter MyAdapter; 公共MyAdapter(字符串[]天,字符串[]号){ 天=天; 数字=数字; setHasStableIds(true); } //设置关键点 公共作废设置SelectionTracker(SelectionTracker SelectionTracker){ mSelectionTracker=selectionTracker; } @凌驾 公共无效onBindViewHolder(MyViewHolder,int位置){ 字符串dayInit=天[位置]; 字符串numberInit=数字[位置]; 长id=getItemId(位置); 布尔值=假; if(mSelectionTracker!=null){ if(mSelectionTracker.isSelected(id)){ isSelected=true; } } 持有者绑定(位置、id、dayInit、numberInit、isSelected); } 公共静态类MyViewHolder扩展了RecyclerView.ViewHolder{ 公共文本视图日视图、数字视图; 公众观点; ScheduleDetails ScheduleDetails=新的ScheduleDetails(); 公共MyViewHolder(查看项目视图){ 超级(项目视图); 视图=项目视图; dayView=itemView.findViewById(R.id.day); numberView=itemView.findViewById(R.id.day\U编号); } void bind(int位置、长键、字符串dayInit、字符串numberInit、布尔值isSelected){ scheduleDetails.position=位置; scheduleDetails.identifier=密钥; 系统输出打印项次(“检查:+位置); dayView.setText(dayInit); numberView.setText(numberInit); 视图。设置已激活(已选择); } public ItemDetailsLookup.ItemDetails getItemDetails(@NonNull MotionEvent MotionEvent){ 返回时间表详细信息; } } 静态类ScheduleDetails扩展了ItemDetailsLookup.ItemDetails{ 内部位置; 长标识符; @凌驾 public int getPosition(){ 返回位置; } @可空 @凌驾 public Long getSelectionKey(){return identifier;} @凌驾 公共布尔值插入选择热点(@NonNull motione){ 返回true; } } //创建新视图(由布局管理器调用) @凌驾 public MyAdapter.MyViewHolder onCreateViewHolder(视图组父级,int-viewType){ View=LayoutInflater.from(parent.getContext()) .充气(R.layout.recycler_layout,parent,false); MyViewHolder vh=新的MyViewHolder(视图); 返回vh; } @凌驾 public int getItemCount(){ 返回天数。长度; } @凌驾 公共长getItemId(int位置){ 返回位置; } }

您可以覆盖
RecyclerView.Adapter
类中的方法并禁用其中的视图。下面是一个基于您提供的代码的示例:

@Override
public void onViewRecycled(@NonNull MyViewHolder holder) {
    //disable activated view when it got recycle
    holder.view.setActivated(false)
    super.onViewRecycled(holder);
}
现在,每次循环使用视图时,您都会取消选择它,并且当再次绑定此视图时(在
MyViewHolder
类的
bind
方法中),您只选择了正确的视图。

您可以覆盖
RecyclerView.Adapter
类中的方法并禁用其中的视图。下面是一个基于您提供的代码的示例:

@Override
public void onViewRecycled(@NonNull MyViewHolder holder) {
    //disable activated view when it got recycle
    holder.view.setActivated(false)
    super.onViewRecycled(holder);
}

现在,每次循环使用视图时,您都会取消选择该视图,当再次绑定该视图时(在
MyViewHolder
类的
bind
方法中),您只选择了正确的视图。

我尝试了这个方法,但不幸地没有成功。感谢您,完整的解决方案必须在onBindViewHolder上重新选择项目;可能会保留屏幕外选定项目的单独列表。或者使用SelectionTracker本身可以实现更干净的实现?我试过了,但不幸的是没有成功。感谢您,完整的解决方案必须在onBindViewHolder上重新选择项目;可能会保留屏幕外选定项目的单独列表。或者,也许可以使用SelectionTracker本身实现更干净的实现?这似乎是一个重复的问题-您是否尝试过那里提出的解决方案?这似乎是一个重复的问题-您是否尝试过那里提出的解决方案?