2016-12-24 20 views
1

我在一個片段中使用RecyclerView,它生成了一個NullPointerException,我無法理解原因。爲什麼Recycler視圖給出空指針異常?

這裏是我的片段活動:

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> 

+0

發表您的logcat的地方出現錯誤 – rafsanahmad007

+0

我認爲這是在你的代碼沒有問題。但我懷疑在recyclerview項目佈局,所以你可以請你發佈你的recyclerview項目佈局 –

+0

我已經發布了XML以及 –

回答

-1

有幾個問題

  1. 你是()清單數據後,填充prepareRechargeData喲u必須設置你的適配器 - 讓你列表rechargelist沒有任何數據在你onCreateViewHolder()

  2. 您正在使用錯誤的佈局R.layout.rechargelist

  3. 在您的視圖持有人你給錯了ID爲TextView的R.id.title

試試這個:

@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(); 
} 
} 
+0

現在我在這一行'adapter.notifyDataSetChanged();'獲得空指針異常 –

+0

我編輯了答案.. – rafsanahmad007

+0

remove adapter.notifyDataSetChanged();在prepareRechargeData()方法.. – rafsanahmad007

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> 

當你正在使用的TextView的錯誤ID在MyViewHolder類。

0

該問題是由於不匹配ID。 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); 
}