I would like to inflate a Recyclerview within a onClickListener Method from a Recyclerview.
For that I know that I have to get the Context from the correspoding activity to set the LinearLayoutManager.
Problem: Since I am using a Recyclerview in Fragment to try to create another Recyclerview I do not know how to get the correct context.
What I tried:
- Use FragmentActivity mContext in my constructor to later on try to get the context via "mContext.getApplicationContext()" (got the FragmentActivity from another post, used Context mContext beforehand)
Issue in the Code: I will break down my Code as good as possible:
- Find the Code from my first Recyclerview from where I try to initialize the LinearLayoutManager
public class deckbuilder_RViewAdapter_Card extends RecyclerView.Adapter {
public deckbuilder_RViewAdapter_Card(FragmentActivity mContext, List<Cards> mData) {
this.mData = mData;
this.mContext = mContext;
}
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
fab_deckbuilder_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<Decklist> listCards = new ArrayList<>();
listCards.add(new Decklist( ... );
LinearLayoutManager layoutManagerCards = new LinearLayoutManager(mContext.getApplicationContext(), LinearLayoutManager.VERTICAL, false);
rvList.setLayoutManager(layoutManagerCards);
deckbuilder_RViewAdapter_List addCardAdapter = new deckbuilder_RViewAdapter_List(mContext, listCards);
rvList.setAdapter(addCardAdapter);
}
});
}
public int getItemCount() {
return mData.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
ImageView ivCardImage;
TextView tvCardName;
public ViewHolder(@NonNull View introListView) {
super(introListView);
fab_deckbuilder_add = introListView.findViewById(R.id.fab_deckbuilder_add);
fab_deckbuilder_remove = introListView.findViewById(R.id.fab_deckbuilder_remove);
rvList = introListView.findViewById(R.id.rv_deckbuilder_list);
}
}
Code from the Recyclerview I want to initialize:
public class deckbuilder_RViewAdapter_List extends RecyclerView.Adapter {
private List<Decklist> mDecklist; private Context mContext; public deckbuilder_RViewAdapter_List (Context mContext, List<Decklist> mDecklist) { this.mDecklist = mDecklist; this.mContext = mContext; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_cardview_deckbuilder_list, viewGroup, false); return new deckbuilder_RViewAdapter_List.ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) { viewHolder.ivCard.setImageResource(mDecklist.get(position).getCardImage()); viewHolder.ivType.setImageResource(mDecklist.get(position).getTypeImage()); viewHolder.tvName.setText(mDecklist.get(position).getName()); viewHolder.tvCost.setText(mDecklist.get(position).getCost()); viewHolder.tvNumber.setText(mDecklist.get(position).getNumber()); } public int getItemCount() { return mDecklist.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ ImageView ivCard, ivType; TextView tvName, tvCost, tvNumber; public ViewHolder(@NonNull View itemView) { super(itemView); ivCard = itemView.findViewById(R.id.ivDecklistCardImage); ivType = itemView.findViewById(R.id.ivDecklistTypeImage); tvName = itemView.findViewById(R.id.tvDecklistName); tvCost = itemView.findViewById(R.id.tvDecklistCost); tvNumber = itemView.findViewById(R.id.tvDecklistNumber); } }
And Lastly please See my Logcat:
2018-11-11 17:46:15.589 21538-21538/com.example.chris.projectartifact E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.chris.projectartifact, PID: 21538
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
at com.example.chris.projectartifact.b_deckbuilderTap.deckbuilder_RViewAdapter_Card$3.onClick(deckbuilder_RViewAdapter_Card.java:116)
at android.view.View.performClick(View.java:6291)
at android.view.View$PerformClick.run(View.java:24931)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:101)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7425)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
Requested edits:
Layout Cardview Decklist:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cardView_deckbuilder_list_id"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cardview= "http://schemas.android.com/apk/res-auto"
android:layout_width="150dp"
android:layout_height="20dp"
android:layout_marginTop="5dp"
cardview:cardCornerRadius="5dp"
android:layout_marginStart="5dp"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:orientation="vertical">
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="0dp"
android:layout_height="match_parent"
android:src="@drawable/axe"
cardview:layout_constraintEnd_toStartOf="@id/gl_v_db_list"
cardview:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/ivDecklistCardImage"
android:layout_width="0dp"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:scrollY="-7dp"
android:src="@drawable/thunder_gods_wrath"
cardview:layout_constraintEnd_toStartOf="@id/gl_v_db_list"
cardview:layout_constraintStart_toStartOf="parent" />
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/ivDecklistTypeImage"
android:layout_width="0dp"
android:layout_height="match_parent"
android:src="@drawable/introspells"
cardview:layout_constraintEnd_toStartOf="@id/gl_v_db_list_secound"
cardview:layout_constraintStart_toStartOf="@id/gl_v_db_list" />
<TextView
android:id="@+id/tvDecklistCost"
android:layout_width="0dp"
android:layout_height="match_parent"
cardview:layout_constraintStart_toStartOf="@id/gl_v_db_list_secound"
android:text="20"
android:autoSizeMaxTextSize="16sp"
android:autoSizeMinTextSize="8sp"
android:autoSizeTextType="uniform"
android:gravity="center"
android:textColor="#ffffff"
cardview:layout_constraintEnd_toEndOf="@id/gl_v_db_list_third"/>
<TextView
android:id="@+id/tvDecklistName"
android:layout_width="0dp"
android:layout_height="match_parent"
cardview:layout_constraintStart_toStartOf="@id/gl_v_db_list_third"
android:text="Thunder"
android:autoSizeMaxTextSize="20sp"
android:autoSizeMinTextSize="8sp"
android:autoSizeTextType="uniform"
android:gravity="center"
android:textColor="#ffffff"
cardview:layout_constraintEnd_toEndOf="@id/gl_v_db_list_last"/>
<TextView
android:id="@+id/tvDecklistNumber"
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="x3"
android:autoSizeMaxTextSize="16sp"
android:autoSizeMinTextSize="8sp"
android:autoSizeTextType="uniform"
android:gravity="center"
android:textColor="#ffff"
cardview:layout_constraintEnd_toEndOf="parent"
cardview:layout_constraintStart_toStartOf="@id/gl_v_db_list_last" />
<android.support.constraint.Guideline
android:id="@+id/gl_v_db_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
cardview:layout_constraintGuide_begin="20dp" />
<android.support.constraint.Guideline
android:id="@+id/gl_v_db_list_secound"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
cardview:layout_constraintGuide_begin="40dp" />
<android.support.constraint.Guideline
android:id="@+id/gl_v_db_list_third"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
cardview:layout_constraintGuide_begin="55dp" />
<android.support.constraint.Guideline
android:id="@+id/gl_v_db_list_last"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
cardview:layout_constraintGuide_end="15dp" />
</android.support.constraint.ConstraintLayout>
</android.support.v7.widget.CardView>
and furthermore please find rv_deckbuilder_list at the end of the following layout:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/background"
>
<LinearLayout
android:id="@+id/llCarddeck"
android:layout_width="0dp"
android:layout_height="60dp"
android:orientation="vertical"
android:layout_marginEnd="10dp"
android:weightSum="6"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="@id/gl_v_66"
app:layout_constraintTop_toTopOf="parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:orientation="horizontal"
android:weightSum="10">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="4.25">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:paddingTop="1dp"
android:text="Rarity"
android:textColor="#fff"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="4.25">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:paddingTop="1dp"
android:text="Category"
android:textColor="#fff"
android:textSize="15sp" />
</LinearLayout>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1.5"
android:gravity="center_horizontal"
android:paddingTop="1dp"
android:text="Order"
android:textColor="#fff"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:orientation="horizontal"
android:weightSum="10">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="1dp"
android:layout_marginEnd="1dp"
android:layout_weight="4.25"
android:background="@drawable/x_linearlayoutcontainer_blank"
android:weightSum="4">
<ToggleButton
android:id="@+id/btnDeckbuilderBasic"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="3dp"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/y_basic_layout" />
<ToggleButton
android:id="@+id/btnDeckbuilderCommon"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="3dp"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/y_common_layout" />
<ToggleButton
android:id="@+id/btnDeckbuilderUncommon"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="3dp"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/y_uncommon_layout" />
<ToggleButton
android:id="@+id/btnDeckbuilderRare"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="2.5dp"
android:layout_marginTop="2.5dp"
android:layout_marginEnd="3dp"
android:layout_marginBottom="2.5dp"
android:layout_weight="1"
android:background="@drawable/y_rare_layout" />
<!--<TextView-->
<!--android:id="@+id/textView"-->
<!--android:layout_width="0dp"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_weight="1"-->
<!--android:text="android:layout_weight="4.25"
-->
<!--android:layout_marginStart="1dp"
 android:layout_marginEnd="1dp"" />-->
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="1dp"
android:layout_marginEnd="1dp"
android:layout_weight="4.25"
android:background="@drawable/x_linearlayoutcontainer_blank"
android:weightSum="4"
android:orientation="horizontal"
>
<android.support.v7.widget.AppCompatSpinner
android:id="@+id/spinnerDeckbuilderCategory"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="3dp"
android:autoSizeMaxTextSize="15sp"
android:autoSizeMinTextSize="10sp"
android:autoSizeTextType="uniform"
android:backgroundTint="@color/white"
android:dropDownWidth="match_parent"
android:popupBackground="#8A8A8A"
android:spinnerMode="dropdown"
android:textSize="15sp" />
<android.support.v7.widget.AppCompatSpinner
android:id="@+id/spinnerDeckbuilder"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="1dp"
android:autoSizeMaxTextSize="15sp"
android:autoSizeMinTextSize="10sp"
android:autoSizeTextType="uniform"
android:backgroundTint="@color/white"
android:dropDownWidth="match_parent"
android:popupBackground="#8A8A8A"
android:spinnerMode="dropdown"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="1dp"
android:layout_marginEnd="1dp"
android:layout_weight="1.5"
android:background="@drawable/x_linearlayoutcontainer_blank">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center">
<android.support.v7.widget.SwitchCompat
android:id="@+id/switchDeckbuilders"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:checked="false"
android:gravity="center|fill_horizontal"
android:showText="false" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<!--<android.support.v7.widget.RecyclerView-->
<!--android:id="@+id/rv_deckbuilder_cards"-->
<!--android:layout_width="0dp"-->
<!--android:layout_height="0dp"-->
<!--/>-->
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_deckbuilder_cards"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginEnd="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/gl_v_66"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/llCarddeck"
/>
<LinearLayout
android:id="@+id/llDecklist"
android:layout_width="0dp"
android:layout_height="30dp"
android:background="@drawable/background"
android:orientation="horizontal"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="@id/gl_v_66"
app:layout_constraintEnd_toEndOf="parent"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_deckbuilder_list"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/gl_v_66"
app:layout_constraintTop_toBottomOf="@+id/llDecklist" />
<!--</android.support.v7.widget.RecyclerView>-->
<android.support.constraint.Guideline
android:id="@+id/gl_v_66"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintGuide_percent="0.66"
android:orientation="vertical" />
</android.support.constraint.ConstraintLayout>
Requested Update 2.0:
The first RV which is called rvCards (via deckbuilder_RViewAdapter_Cards) is getting inflated in the following fragment:
public class deckbuilder_fragment extends Fragment {
//..
List<Cards> listCards;
DBHelper dbHelper;
RecyclerView rvCards;
//..
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// return super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.deckbuilder_fragment, container, false);
//..
//...
dbHelper = new DBHelper(getActivity().getApplicationContext());
dbHelper.createDataBase();
rvCards = view.findViewById(R.id.rv_deckbuilder_cards);
updateAdapter();
return view;
}}
Whereas the Adapter is updated in:
public void updateAdapter() {
listCards = dbHelper.getDeckbuilderCards(spinnerDeckbuilderType.getSelectedItem().toString(), true, btnDeckbuilderBasic.isChecked(), btnDeckbuilderCommon.isChecked(), btnDeckbuilderUncommon.isChecked(),btnDeckbuilderRare.isChecked(), spinnerDeckbuilderCategory.getSelectedItem().toString());
LinearLayoutManager layoutManagerCards = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
rvCards.setLayoutManager(layoutManagerCards);
deckbuilder_RViewAdapter_Card newAdapterCards = new deckbuilder_RViewAdapter_Card(getActivity(), listCards);
rvCards.setAdapter(newAdapterCards);
}
I think you're just getting
rvList
from the wrong place, it shouldn't be in your view holder, it should be in your fragment, that's why it's throwing NullPointerException when you click on it.Firstly, remove
rvList = introListView.findViewById(R.id.rv_deckbuilder_list);
from your view holder, because it will only return null.Next, update your
deckbuilder_RViewAdapter_List
adapter so it can support data changes:And also update your
deckbuilder_RViewAdapter_Card
adapter so it can take in a reference ofdeckbuilder_RViewAdapter_List
:And finally, find the
RecyclerView
s in your fragment, then attach them with appropriate adapters: