简体   繁体   English

Android:RecyclerViewAdapter中的GetApplication

[英]Android: GetApplication in RecyclerViewAdapter

I would like to inflate a Recyclerview within a onClickListener Method from a Recyclerview. 我想在Recyclerview的onClickListener方法内为Recyclerview充气。

For that I know that I have to get the Context from the correspoding activity to set the LinearLayoutManager. 为此,我知道我必须从相应的活动中获取上下文来设置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. 问题:由于我正在Fragment中使用Recyclerview来尝试创建另一个Recyclerview,所以我不知道如何获取正确的上下文。

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) 在我的构造函数中使用FragmentActivity mContext,以后再尝试通过“ mContext.getApplicationContext()”获取上下文 (从另一篇文章中获取了FragmentActivity,预先使用了Context mContext)

Issue in the Code: I will break down my Code as good as possible: 准则中的问题:我将尽力分解准则:

  1. Find the Code from my first Recyclerview from where I try to initialize the LinearLayoutManager 从我尝试初始化LinearLayoutManager的第一个Recyclerview中找到代码

public class deckbuilder_RViewAdapter_Card extends RecyclerView.Adapter { 公共类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);

        }
    }
  1. Code from the Recyclerview I want to initialize: 我想初始化的Recyclerview中的代码:

    public class deckbuilder_RViewAdapter_List extends RecyclerView.Adapter { 公共类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); } } 

And Lastly please See my Logcat: 最后,请参阅我的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: 布局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>

and furthermore please find rv_deckbuilder_list at the end of the following layout: 并且请在以下布局的末尾找到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>

Requested Update 2.0: 要求的更新2.0:

The first RV which is called rvCards (via deckbuilder_RViewAdapter_Cards) is getting inflated in the following fragment: 第一个称为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;

}}

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. 我认为您只是从错误的位置获取rvList ,不应将其放在视图持有rvList ,而应将其放在片段中,这就是为什么单击它时会引发NullPointerException。

Firstly, remove rvList = introListView.findViewById(R.id.rv_deckbuilder_list); 首先,删除rvList = introListView.findViewById(R.id.rv_deckbuilder_list); from your view holder, because it will only return null. 从您的视图持有者那里获得,因为它只会返回null。

Next, update your deckbuilder_RViewAdapter_List adapter so it can support data changes: 接下来,更新您的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();
}

And also update your deckbuilder_RViewAdapter_Card adapter so it can take in a reference of deckbuilder_RViewAdapter_List : 并更新您的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);
        }
    });
}

And finally, find the RecyclerView s in your fragment, then attach them with appropriate adapters: 最后,在您的片段中找到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM