[英]Recycler View not calling onBindviewHolder
OnBindViewHolder isn't called when I try to select an element inside the recycler view.当我尝试在回收器视图中选择一个元素时,不会调用 OnBindViewHolder。 I'm using a horizontal layout with all the elements not showing initially (4 out of 7 elements are showing and when user motions to right the 3 elements alternate).
我使用的是水平布局,所有元素最初都没有显示(7 个元素中有 4 个正在显示,当用户向右移动时,3 个元素交替显示)。 Usually, when the user clicks an element OnBindViewHolder is supposed to fire but it's not happening for me.
通常,当用户单击元素 OnBindViewHolder 时应该会触发,但对我来说却没有发生。 The only time it fires is on initialization.
它唯一触发的时间是初始化。 Since it doesn't fire I can't click any of the elements inside the recycler view.
由于它不会触发,因此我无法单击回收器视图中的任何元素。 Maybe it might have to do with my layouts?
也许这可能与我的布局有关? I'm not sure
我不知道
MyAdapter我的适配器
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;
}
SOLVED解决了
@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;
}
I retrieved position from getItemId and put that into my id variable (I used setHasStableIds).我从 getItemId 检索位置并将其放入我的 id 变量中(我使用了 setHasStableIds)。 Click Listener isn't needed for this implementation.
此实现不需要单击侦听器。 This is for the androidx recyclerview-selection library
这是针对 androidx recyclerview-selection 库
Lastly I declared these in MyViewHolder:最后我在 MyViewHolder 中声明了这些:
scheduleDetails.position = position;
scheduleDetails.position = 位置; scheduleDetails.identifier = key;
scheduleDetails.identifier = 键;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.