为什么Recycler视图会给出空指针异常?

时间:2016-12-24 11:39:37

标签: android android-recyclerview

我在片段中使用RecyclerView,它会生成NullPointerException而我无法理解原因。

这是我的片段活动:

public class Recharges extends Fragment {

public RecyclerView recyclerView;
private List<GetRecharge> rechargeList = new ArrayList<>();
public RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;
ImageView image1, image2;

@Nullable @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    Toolbar myToolbar = (Toolbar) getActivity().findViewById(R.id.my_toolbar);
    ((AppCompatActivity) getActivity()).setSupportActionBar(myToolbar);

    View rootView = inflater.inflate(R.layout.recharges, container, false);

    recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview1);
    recyclerView.setHasFixedSize(true);

    final FragmentActivity c = getActivity();

    layoutManager = new LinearLayoutManager(c);
    recyclerView.setLayoutManager(layoutManager);

    adapter = new Adapterrecharge(rechargeList);
    recyclerView.setAdapter(adapter);

    prepareRechargeData();

    return rootView;

}

private void prepareRechargeData() {
    GetRecharge recharge = new GetRecharge("Mad Max: Fury Road" );
    rechargeList.add(recharge);

    adapter.notifyDataSetChanged();
}

}

这里是适配器类:

public class Adapterrecharge extends RecyclerView.Adapter<Adapterrecharge.MyViewHolder> {

private List<GetRecharge> rechargeList;

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView title;
    ImageView image;

    public MyViewHolder(View view) {
        super(view);
        title = (TextView) view.findViewById(R.id.title);
    }
}

public Adapterrecharge(List<GetRecharge> rechargeList) {
    this.rechargeList = rechargeList;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.rechargelist, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    GetRecharge recharge = rechargeList.get(position);
    holder.title.setText(recharge.getTitle());
}

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

我似乎正在膨胀正确的布局但仍然得到错误。 这是logcat错误

   java.lang.NullPointerException
   at com.example.aadesh.walletuncle.Adapterrecharge.onBindViewHolder(Adapterrecharge.java:53)
   at com.example.aadesh.walletuncle.Adapterrecharge.onBindViewHolder(Adapterrecharge.java:21)

这是recyclerview项目布局。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/text"/>

这是主要布局

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">

<android.support.v7.widget.Toolbar
    android:id="@+id/my_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:elevation="4dp"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

    <TextView
        android:text="Recharge"
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"
        android:textColor="#ffffff"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView4"
        android:layout_weight="1" />



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

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical"
    android:id="@+id/recyclerview1">


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

3 个答案:

答案 0 :(得分:0)

有几个问题

  1. 您在设置适配器后填充prepareRechargeData()列表数据 - 因此您的列表充值列表没有任何数据

  2. {li>

    onCreateViewHolder()您使用了错误的布局R.layout.rechargelist

  3. 在您的视图持有人中,您为textview提供了错误的ID R.id.title

  4. 试试这个:

      @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    
        Toolbar myToolbar = (Toolbar) getActivity().findViewById(R.id.my_toolbar);
        ((AppCompatActivity) getActivity()).setSupportActionBar(myToolbar);
    
        View rootView = inflater.inflate(R.layout.recharges, container, false);
    
        recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview1);
        recyclerView.setHasFixedSize(true);
    
        final FragmentActivity c = getActivity();
    
        layoutManager = new LinearLayoutManager(c);
        recyclerView.setLayoutManager(layoutManager);
    
        /*recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter((RecyclerView.Adapter) adapter);*/
    
        prepareRechargeData();
        adapter = new Adapterrecharge(rechargeList);
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    
        return rootView;
    
    }
    

    将适配器更改为:

        public class Adapterrecharge extends RecyclerView.Adapter<Adapterrecharge.MyViewHolder> {
    
    private List<GetRecharge> rechargeList;
    
    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title;
        ImageView image;
    
        public MyViewHolder(View view) {
            super(view);
            title = (TextView) view.findViewById(R.id.text);
        }
    }
    
    public Adapterrecharge(List<GetRecharge> rechargeList) {
        this.rechargeList = rechargeList;
    }
    
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recyclerview_item_layout, parent, false);
    
        return new MyViewHolder(itemView);
    }
    
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        GetRecharge recharge = rechargeList.get(position);
        holder.title.setText(recharge.getTitle());
    }
    
    @Override
    public int getItemCount() {
        return rechargeList.size();
    }
    }
    

答案 1 :(得分:0)

您错过了匹配Textview的ID。 而不是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
   <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:id="@+id/text"/>
</LinearLayout>

使用此

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
   <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:id="@+id/title"/>
</LinearLayout>

因为您在MyViewHolder类中使用了错误的Textview ID。

答案 2 :(得分:0)

问题是由于匹配不匹配。 xml(“text”)中TextView的ID和ViewHolder类(“title”)中膨胀的ID不同。

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/text"/>

适配器类

public MyViewHolder(View view) {
    super(view);
    title = (TextView) view.findViewById(R.id.title);
}