Android的Linearlayout findView并在recycleradapter中设置背景

问题描述

我有一个带有RecyclerView的LinearLayout xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:id="@+id/r1"
    android:background="#DBDBDB">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#DBDBDB" />
</LinearLayout>

在我的java类中,我设置了整个Linearlayout的背景图像:

LinearLayout linear;
linear = findViewById(R.id.r1);
linear.setBackgroundResource(R.drawable.visitedbg);

这很好。但是我也想在Recycleradapter中为Linearlayout设置背景。

在列表中,用户可以通过单击来删除任何项目。如果最后一项被删除,我想显示背景图像。

onBindViewHolder方法中,我有

 movieList.remove(position);notifyDataSetChanged();

if (getItemCount()<=0){holder.linear.setBackgroundResource(R.drawable.visitedbg);}

问题是Nullpointer异常,因为我无法在Recycleradapter中定义LinearLayout视图。

我试图将它放在public MyviewHolder(View itemView)上,也以{p>

RecyclerAdapter.MyviewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType)

,但这仍然无法正常工作。有什么解决办法吗?

解决方法

首先,我建议从findViewById()迁移到viewBindng,以防止应用程序在运行时崩溃。 其次,您只能从适配器访问recyclerView项目内部的视图。要实现您想要的功能,您应该侦听recyclerView的适配器更改。您可以使用AdapterDataObserver:

adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeRemoved(int positionStart,int itemCount) {
            super.onItemRangeRemoved(positionStart,itemCount);
            //...
        }
    });

看看Android文档中的this link

另一种实现方法是每次删除元素时都要检查适配器的项数:

movieList.remove(position);
notifyItemRemoved(position);

if(adapter.getItemCount() == 0)
    linear.setBackgroundResource(R.drawable.visitedbg)