RecyclerView 适配器中的空侦听器

Posted

技术标签:

【中文标题】RecyclerView 适配器中的空侦听器【英文标题】:Null Listener in RecyclerView Adapter 【发布时间】:2021-10-05 11:43:24 【问题描述】:

android Studio RecyclerView 自定义适配器中的侦听器返回 null。

这是界面

  private OnItemClickListener mlistener;

    public interface OnItemClickListener
        void onItemClick(int position, Boolean paid);
    
    public void setOnItemClickListener(OnItemClickListener listener)
        mlistener = listener;
    

这就是 View Holder 和 Listener。这旨在将布尔值传递给主要活动。

 public CartViewHolder(View itemView, ArrayList<Shift> shifts, OnItemClickListener listener) 
            super(itemView);

         
            paid = itemView.findViewById(R.id.due_back_paid);
            containerView = itemView.findViewById(R.id.container);


            paid.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 

                    if (listener !=  null)
                        int position = getAdapterPosition();
                        if(position != RecyclerView.NO_POSITION)
                            listener.onItemClick(position, isChecked);
                        
                    
                
            );


            containerView.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    Shift current = (Shift)containerView.getTag();
                    Intent intent = new Intent(v.getContext(), ViewShiftActivity.class);
                    intent.putExtra("thisShift", current);
                    intent.putExtra("shifts", shifts);
                    v.getContext().startActivity(intent);

                
            );


        


    

    public LoadAdapter(ArrayList<Shift> shifts)
        shiftList = shifts;
    

    @NonNull
    @Override
    public CartViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shift_row, parent, false);
        CartViewHolder mvh = new CartViewHolder(view, shiftList, mlistener);
        return mvh;
    

我已在其他项目中使用过此代码,并且可以正常工作。我似乎无法弄清楚我错过了什么。

我被要求包含该活动。以下是这段代码。 我还没有在 onItemClick 中添加任何代码。等待监听器工作。

public class EditShiftActivity extends AppCompatActivity implements LoadAdapter.OnItemClickListener

    private ArrayList<Shift> shifts;
    private RecyclerView lRecyclerView;
    private LoadAdapter lAdapter;
    private RecyclerView.LayoutManager lLayoutManager;
    private View view;
    private FloatingActionButton fab;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_shift);

        Intent intent = getIntent();
        shifts = intent.getParcelableArrayListExtra("shifts");

        fab = findViewById(R.id.add_shift_edit);
        fab.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent intent1 = new Intent(EditShiftActivity.this, AddShiftActivity.class);
                intent1.putExtra("shifts", shifts);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                v.getContext().startActivity(intent1);
            
        );
        
        lRecyclerView = findViewById(R.id.shift_recycler);
        lLayoutManager = new LinearLayoutManager(this);
        lAdapter = new LoadAdapter(shifts);
        lRecyclerView.setLayoutManager(lLayoutManager);
        lRecyclerView.setAdapter(lAdapter);
    
    
    @Override
    public void onItemClick(int position, Boolean paid) 

    

【问题讨论】:

分享你的活动代码,你在哪里实现了这个适配器。 Priyanka,我已经添加了活动。谢谢 我看不到你打电话给setOnItemClickListener( with a listener implementation ) 它在第一个代码块中。 ???? 您错过了一行,请检查我的答案并添加此内容。代码可以正常工作。 【参考方案1】:

在您的代码中添加以下行 -

lAdapter = new LoadAdapter(shifts);
lAdapter.setOnItemClickListener(this);

【讨论】:

【参考方案2】:

您正在从 Intent 中检索 ArrayList&lt;Shifts&gt;。在发送到适配器之前检查shifts arraylist 的大小。如果传递的arraylist 为空,则适配器可能会返回null,因此lRecyclerView 将不会显示。

在将数据传递给适配器之前添加此条件

//condition to check whether the arraylist is empty or not
if(!shifts.isEmpty()) 

 lAdapter = new LoadAdapter(shifts);
 
 //initialising the adapter
 lRecyclerView.setAdapter(lAdapter);

【讨论】:

谢谢。将来我会将其添加到我的代码中。但这不是问题。感谢您的宝贵时间?

以上是关于RecyclerView 适配器中的空侦听器的主要内容,如果未能解决你的问题,请参考以下文章

如何防止android应用程序由于recyclerview中的空列表而崩溃? [复制]

RecyclerView 中的 OnLongItemClick

如何在MVVM架构中观察RecyclerView适配器中的LiveData?

在滚动时在 recyclerview 中加载更多数据

List<User> 不删除它包含在 RecyclerView 适配器中的 POJO 对象

setAdapter 上的空对象引用错误