gpt4 book ai didi

java - Android:RecyclerViewAdapter 中的 GetApplication

转载 作者:行者123 更新时间:2023-12-02 10:36:37 27 4
gpt4 key购买 nike

我想在 Recyclerview 的 onClickListener 方法中膨胀 Recyclerview。

为此,我知道我必须从相应的 Activity 中获取上下文才能设置 LinearLayoutManager。

问题:由于我在 Fragment 中使用 Recyclerview 来尝试创建另一个 Recyclerview,我不知道如何获取正确的上下文。

我尝试过的:

  • 在我的构造函数中使用 FragmentActivity mContext,稍后尝试通过“mContext.getApplicationContext()”获取上下文 (从另一篇文章中获取 FragmentActivity,事先使用 Context mContext)

代码中的问题:我将尽可能详细地分解我的代码:

  1. 从我尝试初始化 LinearLayoutManager 的第一个 Recyclerview 中找到代码

公共(public)类 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 代码:

    公共(public)类 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)

    请求的修改:

    布局卡片 View 牌组列表:

    <?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=&quot;4.25&quot;&#xA;-->
    <!--android:layout_marginStart=&quot;1dp&quot;&#xA; android:layout_marginEnd=&quot;1dp&quot;" />-->
    </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)在以下 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;

    }}

    而适配器更新于:

    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,它不应该在您的 View 持有者中,它应该在您的 fragment 中,这就是为什么当您单击它时它会抛出 NullPointerException .

    首先,从 View 持有者中删除 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);
    }
    });
    }

    最后,在 fragment 中找到 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);

    // ...
    }

    关于java - Android:RecyclerViewAdapter 中的 GetApplication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53247870/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com