问题描述
我有一个带有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设置背景。
在列表中,用户可以通过单击来删除任何项目。如果最后一项被删除,我想显示背景图像。
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)