【问题标题】:Recycler View Not Deselecting When View Is Hidden隐藏视图时回收站视图未取消选择
【发布时间】:2020-01-01 13:56:10
【问题描述】:

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

状态 1

状态2

在本例中,在State 1State 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;
}

}

【问题讨论】:

标签: java android android-recyclerview


【解决方案1】:

您可以在 RecyclerView.Adapter 类中覆盖 onViewRecycled 方法并禁用那里的视图。这是基于您提供的代码的示例:

@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 本身可以实现更简洁的实现?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
相关资源
最近更新 更多