Я попытался создать RecyclerView для фрагмента с пользовательским макетом, поэтому я использовал адаптер, но когда я попытался установить адаптер, я получил следующие ошибки:
java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference
Я пробовал некоторые решения в Интернете, все предлагают попробовать найти recyclerview внутри OnViewCreated. Но мой код все еще не может найти recyclerview внутри файла макета.
Это мой файл fragment_hadiah.xml
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".HadiahFragment"
android:orientation = "vertical">
<LinearLayout
android:layout_width = "match_parent"
android:padding = "20dp"
android:layout_height = "wrap_content"
android:orientation = "vertical">
<LinearLayout
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:orientation = "horizontal">
<ImageView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:src = "@drawable/ic_video"/>
<TextView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "x Dopa Eggs"
android:textSize = "20sp"
android:textStyle = "bold"
android:layout_marginStart = "10dp"/>
</LinearLayout>
<TextView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Tukarkan pointmu"/>
</LinearLayout>
<HorizontalScrollView
android:layout_width = "match_parent"
android:layout_height = "wrap_content">
<LinearLayout
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:orientation = "horizontal"
android:paddingVertical = "10dp">
<Button
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "GOPAY"
android:layout_marginLeft = "20dp"/>
<Button
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "OVO"
android:layout_marginLeft = "20dp"/>
<Button
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "DANA"
android:layout_marginLeft = "20dp"/>
<Button
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Coming Soon"
android:layout_marginLeft = "20dp"/>
<Button
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Coming Soon"
android:layout_marginLeft = "20dp"/>
</LinearLayout>
</HorizontalScrollView>
<androidx.recyclerview.widget.RecyclerView
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:id = "@+id/hadiahRecylerView"/>
</LinearLayout>
Вот мой класс HadiahFragment.java
package com.dopami.projecthatchedeggs;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.dopami.projecthatchedeggs.adapter.HadiahItemAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
* Use the {@link HadiahFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class HadiahFragment extends Fragment {
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
RecyclerView hadiahRecyclerView;
public HadiahFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment HadiahFragment.
*/
public static HadiahFragment newInstance(String param1, String param2) {
HadiahFragment fragment = new HadiahFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_beranda, container, false);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
List<String> itemList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
itemList.add(String.valueOf(i));
}
Toast.makeText((HomeActivity) getActivity(), "OK", Toast.LENGTH_SHORT).show();
hadiahRecyclerView = view.findViewById(R.id.hadiahRecylerView);
HadiahItemAdapter itemAdapter = new HadiahItemAdapter(itemList, (HomeActivity) getActivity());
GridLayoutManager gridLayoutManager = new GridLayoutManager((HomeActivity)getActivity(), 2);
hadiahRecyclerView.setAdapter(itemAdapter);
hadiahRecyclerView.setLayoutManager(gridLayoutManager);
}
}
Вот мой класс HadiahItemAdapter.java
package com.dopami.projecthatchedeggs.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import com.dopami.projecthatchedeggs.R;
import java.util.List;
public class HadiahItemAdapter extends RecyclerView.Adapter<HadiahItemAdapter.ItemViewHolder>{
private List<String> mItemList;
private Context mContext;
public HadiahItemAdapter(List<String> mItemList, Context mContext) {
this.mItemList = mItemList;
this.mContext = mContext;
}
@NonNull
@Override
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.hadiah_card_item, parent, false);
return new ItemViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
String item = mItemList.get(position);
holder.textView.setText(item);
}
@Override
public int getItemCount() {
return mItemList.size();
}
class ItemViewHolder extends RecyclerView.ViewHolder{
private CardView cardView;
private TextView textView;
public ItemViewHolder(@NonNull View itemView) {
super(itemView);
cardView = itemView.findViewById(R.id.hadiahCardView);
textView = itemView.findViewById(R.id.hadiahCardTextView);
}
}
}
С нетерпением жду решений от вас, ребята, спасибо за помощь...
Отвечает ли это на ваш вопрос? Что такое исключение NullPointerException и как его исправить?
Ага, не понял, что надуваю не тот макет, теперь исправил :)
@Regn, почему вы не используете привязку представления? Больше не делаю findViewById()
!!!
@ Sambhav.K Вау, для меня это звучит ново, у вас есть ссылки или руководство о том, как это сделать? Большое спасибо за идею
См. это
Ваш фрагмент раздувает XML следующим образом:
View view = inflater.inflate(R.layout.fragment_beranda, container, false);
R.layout.fragment_beranda
— это не тот макет, который вам нужен (или общий fragment_hadiah.xml
).
Поэтому в onViewCreated
hadiahRecyclerView = view.findViewById(R.id.hadiahRecylerView);
HadiahItemAdapter itemAdapter = new HadiahItemAdapter(itemList, (HomeActivity) getActivity());
GridLayoutManager gridLayoutManager = new GridLayoutManager((HomeActivity)getActivity(), 2);
hadiahRecyclerView.setAdapter(itemAdapter);
hadiahRecyclerView
не существует в файле XML, поэтому переменная hadiahRecyclerView
имеет значение null
значение
hadiahRecyclerView.setAdapter(itemAdapter);
эта строка вылетает с NullPointerException
Ошибка трассировки стека, которой вы поделились, говорит именно об этом:
java.lang.NullPointerException: Attempt to invoke virtual method
'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)'
on a null object reference
Привет, Бланделл, спасибо за ответ, эти простые опечатки действительно застают меня врасплох, спасибо за исправление. Я даже не знал, что я надуваю неправильный макет. Это почти занимает у меня час, чтобы исправить. Большое спасибо... :))
Без проблем. Когда вы получаете исключение нулевого указателя для переменной, которая является результатом findViewById
, это означает, что идентификатор XML не может быть найден, что обычно означает, что вы не увеличиваете файл XML, содержащий этот идентификатор.
Понятно! ??...
Ты надуваешь
R.layout.fragment_beranda
пока у тебяrecyclerview
внутриR.layout.fragment_hadiah
.. Почему так ?