繁体   English   中英

Recycler View 不调用 onBindviewHolder

[英]Recycler View not calling onBindviewHolder

当我尝试在回收器视图中选择一个元素时,不会调用 OnBindViewHolder。 我使用的是水平布局,所有元素最初都没有显示(7 个元素中有 4 个正在显示,当用户向右移动时,3 个元素交替显示)。 通常,当用户单击元素 OnBindViewHolder 时应该会触发,但对我来说却没有发生。 它唯一触发的时间是初始化。 由于它不会触发,因此我无法单击回收器视图中的任何元素。 也许这可能与我的布局有关? 我不知道

我的适配器

public MyAdapter(){
    this.setHasStableIds(true);
}


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

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, String dayInit, String numberInit, Boolean isSelected){
        scheduleDetails.position = position;
        System.out.println("Hit2: " + scheduleDetails.position);

        dayView.setText(dayInit);
        numberView.setText(numberInit);
        view.setSelected(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;
    }
}

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


@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 void onBindViewHolder(MyViewHolder holder, int position) {
    String dayInit = days[position];
    String numberInit = numbers[position];
    Long positions = (long) position;

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

    boolean isSelected = false;
    if(mSelectionTracker != null){
        if(mSelectionTracker.isSelected(positions)){
            isSelected = true;
        }
        holder.bind(position, dayInit, numberInit, isSelected);
    }
}

// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
    return days.length;
}

@Override
public long getItemId(int position) {
    return position;
}

解决了

@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;
        }
    }

    System.out.println("Here: " + isSelected);
    holder.bind(position, id, dayInit, numberInit, isSelected);
}

@Override
public long getItemId(int position) {
    return position;
}

我从 getItemId 检索位置并将其放入我的 id 变量中(我使用了 setHasStableIds)。 此实现不需要单击侦听器。 这是针对 androidx recyclerview-selection 库

最后我在 MyViewHolder 中声明了这些:

scheduleDetails.position = 位置; scheduleDetails.identifier = 键;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM