【问题标题】:Android findView of Linearlayout and set background in recycleradapterAndroid findView的Linearlayout并在recycleradapter中设置背景
【发布时间】:2020-11-05 21:44:49
【问题描述】:

我有一个带有 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 设置背景。

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

onBindViewHoldermethod 我有:

 movieList.remove(position);notifyDataSetChanged();

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

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

我试着把它发给public MyviewHolder(View itemView),也公开RecyclerAdapter.MyviewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)作为

 LinearLayout linear = itemView.findViewById(R.id.r1);

但这仍然不起作用。有什么解决办法吗?

【问题讨论】:

    标签: android android-recyclerview setbackground


    【解决方案1】:

    首先,我建议从 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)
    

    【讨论】:

    • 谢谢,我试过了,但是在 onItemRangeRemoved(int positionStart, int itemCount) 中,itemCount 永远不会是 0,即使最后一项被删除,它仍然是 1。在我的 recycleradapter 中,我有movieList。移除(位置);notifyItemRemoved(位置);notifyDataSetChanged();
    • @Darksymphony 实现相同接口的 onChanged() 方法,并检查 adapter.getItemCount()。
    • linear.setBackgroundResource 不起作用,因为我无法在 recycleradapter 中设置 linearLayout。但是您能否发布一个示例,将 onChanged 放在哪里?而不是 onItemRangeRemoved ?
    • @Darksymphony 正如我在回答中所说,您无法访问适配器内 recyclerview 之外的视图。您应该在声明了 recyclerview 和适配器的片段或活动中使用此方法。你也可以使用第二种方式。
    • 好的,终于可以了。我在 registerAdapterDataObserver 中使用了 recyclerAdapter.getItemCount() 而不是 itemCount,现在它可以按预期工作。谢谢你的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多