Android: GetApplication в RecyclerViewAdapter - PullRequest
0 голосов
/ 11 ноября 2018

Я хотел бы накачать Recyclerview в методе onClickListener из Recyclerview.

Для этого я знаю, что мне нужно получить Контекст из действия по переписыванию, чтобы установить LinearLayoutManager.

Проблема: Поскольку я использую Recyclerview во фрагменте, чтобы попытаться создать другое Recyclerview, я не знаю, как получить правильный контекст.

Что я пробовал:

  • Используйте FragmentActivity mContext в моем конструкторе, чтобы позже попытаться получить контекст через "mContext.getApplicationContext ()" (получил FragmentActivity из другого поста, заранее использовал Context mContext)

Проблема в коде: Я сломаю свой Код как можно лучше:

  1. Найдите код из моего первого Recyclerview, откуда я пытаюсь инициализировать LinearLayoutManager

открытый класс 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. Код из 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)

Запрошенные правки:

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>

и, кроме того, найдите 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:

Первый RV, который называется rvCards (через 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);

    }

1 Ответ

0 голосов
/ 11 ноября 2018

Я думаю, что вы просто получаете rvList из неправильного места, оно не должно быть в вашем держателе просмотра, оно должно быть в вашем фрагменте, поэтому оно вызывает исключение NullPointerException при нажатии на него.

Во-первых, удалите rvList = introListView.findViewById(R.id.rv_deckbuilder_list); из держателя просмотра, потому что он вернет только ноль.

Затем обновите адаптер 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 s в вашем фрагменте, затем присоедините их с помощью соответствующих адаптеров:

@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);

    // ...
}
...