[英]Android: Setter in Fragment & get String in RecyclerViewAdapter
[英]Android: GetApplication in RecyclerViewAdapter
我想在Recyclerview的onClickListener方法內為Recyclerview充氣。
為此,我知道我必須從相應的活動中獲取上下文來設置LinearLayoutManager。
問題:由於我正在Fragment中使用Recyclerview來嘗試創建另一個Recyclerview,所以我不知道如何獲取正確的上下文。
我試過的
准則中的問題:我將盡力分解准則:
公共類deckbuilder_RViewAdapter_Card擴展了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);
}
}
我想初始化的Recyclerview中的代碼:
公共類deckbuilder_RViewAdapter_List擴展了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); } }
最后,請參閱我的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)
要求的修改:
布局Cardview清單列表:
<?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>
並且請在以下布局的末尾找到rv_deckbuilder_list:
<?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>
要求的更新2.0:
第一個稱為rvCards的RV(通過deckbuilder_RViewAdapter_Cards)在以下片段中被誇大:
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;
}}
而適配器在以下位置更新:
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);
}
我認為您只是從錯誤的位置獲取rvList
,不應將其放在視圖持有rvList
,而應將其放在片段中,這就是為什么單擊它時會引發NullPointerException。
首先,刪除rvList = introListView.findViewById(R.id.rv_deckbuilder_list);
從您的視圖持有者那里獲得,因為它只會返回null。
接下來,更新您的deckbuilder_RViewAdapter_List
適配器,以便它可以支持數據更改:
public deckbuilder_RViewAdapter_List (Context mContext, List<Decklist> mDecklist) {
this.mDecklist = mDecklist;
this.mContext = mContext;
}
public void setCards(List<Decklist> mDecklist) {
this.mDecklist = mDecklist;
notifyDataSetChanged();
}
並更新您的deckbuilder_RViewAdapter_Card
適配器,以便它可以引用deckbuilder_RViewAdapter_List
的引用:
private deckbuilder_RViewAdapter_List mCardListAdapter;
public deckbuilder_RViewAdapter_Card(FragmentActivity mContext, List<Cards> mData, deckbuilder_RViewAdapter_List mCardListAdapter) {
this.mData = mData;
this.mContext = mContext;
this.mCardListAdapter = mCardListAdapter;
}
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( ... );
mCardListAdapter.setCards(listCards);
}
});
}
最后,在您的片段中找到RecyclerView
,然后將它們附加到適當的適配器:
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// ... after inflate view
rvCards = view.findViewById(R.id.rv_deckbuilder_cards)
rvList = view.findViewById(R.id.rv_deckbuilder_list)
deckbuilder_RViewAdapter_List listAdapter = new deckbuilder_RViewAdapter_List(..)
deckbuilder_RViewAdapter_Card cardAdapter = new deckbuilder_RViewAdapter_Card(.., listAdapter)
rvCards.setAdapter(cardAdapter);
rvList.setAdapter(listAdapter);
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.