java.lang.NullPointerException:尝试从viewholder访问textview

时间:2018-04-18 10:30:14

标签: java android android-recyclerview recycler-adapter

我有自定义RecycleView,我可以成功显示RecycleView中的数据。现在,我想从自定义布局访问文本视图,以便在我的代码的后续部分进行更改。我提供了布局RecycleView适配器以及我尝试访问TextView的方法。但是我得到NullPointerException,视图为null。如何在我的主要活动中从Mylayout.xml访问textview((R.id.zb)以修改RecycleView项?

我的布局:

<android.support.v7.widget.CardView android:id="@+id/card_view1"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardBackgroundColor="@color/cardview_light_background"
card_view:cardCornerRadius="5dp"
card_view:cardUseCompatPadding="true"
xmlns:android="http://schemas.android.com/apk/res/android">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="3"
    android:orientation="horizontal"
    android:id="@+id/z">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Z "
        style="@style/Base.TextAppearance.AppCompat.Large.Inverse"
        android:layout_weight="1"
        android:textColor="@color/colorPrimary"
        android:gravity="center"
        android:id="@+id/zn"/>

    <TextView
        android:id="@+id/zb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="buy"
        android:textColor="#333"
        style="@style/Base.TextAppearance.AppCompat.Medium.Inverse"/>

    <TextView
        android:id="@+id/zs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="Sell"
        android:textColor="#333"
        style="@style/Base.TextAppearance.AppCompat.Medium.Inverse"/>

</LinearLayout>

 </android.support.v7.widget.CardView>

RecycleView适配器:

public class Adapter extends RecyclerView.Adapter<Adapter.Viewholder> {

private List<dispitems> m;


@NonNull
@Override
public Adapter.Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list1, parent, false);
    return new Viewholder(itemView);
}

@Override
public void onBindViewHolder(@NonNull Adapter.Viewholder holder, int position) {
    dispitems d = m.get(position);
    holder.zb.setText(d.getZb());
    holder.zs.setText(d.getZs());
    holder.zn.setText(d.getZn());
 }

@Override
public int getItemCount() {
    return m.size();

}

Adapter(List<dispitems> m) {
    this.m = m;
}


public class Viewholder extends RecyclerView.ViewHolder {
    public TextView zb,zs,zn;

    Viewholder(View itemView) {
        super(itemView);
        zn = (TextView) itemView.findViewById(R.id.zn);
        zb = (TextView) itemView.findViewById(R.id.zb);
        zs = (TextView) itemView.findViewById(R.id.zs);

    }
}
}

我已尝试过以下选项,但它显示空指针异常

Adapter.Viewholder row = (Adapter.Viewholder) recyclerView.findViewHolderForAdapterPosition(getCategoryPos(device));

row.zs.setTextColor(ContextCompat.getColor(this, R.color.colorAccent));

我收到了以下例外情况。

   java.lang.NullPointerException: Attempt to read from field 'android.widget.TextView cti.cryptotrackerindia.Adapter$Viewholder.zsell' on a null object reference

尝试了下面的内容

 View row = recyclerView.getLayoutManager().getChildAt(getCategoryPos(device));

2 个答案:

答案 0 :(得分:0)

也许我没有得到问题,但是你应该能够在夸大视图后在onCreateViewHolder上获取textview。

public Adapter.Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.list1, parent, false);
    TextView txtView = (TextView )itemView.findViewById(R.id.zb);
    return new Viewholder(itemView);
}

然后将其存储为适配器中的成员。

答案 1 :(得分:0)

如果要更新RecyclerView中显示的数据,则应使用notifyItemChanged(position, payload)执行ViewHolder的部分重新绑定。

直接修改ViewHolder的布局而不引用所表示的数据会导致显示的视图出现差异,尤其是当您开始滚动列表并且ViewHolder开始被回收并重新用于其他项目时。