Метод RecyclerView.Adapter onBind не распознает элементы просмотра из строки xml в android

Создавая простую программу, которая принимает список элементов MAX 4, я выбрал для оптимизации RecyclerView вместо ListView. Я добавил и привязал RecyclerView к моему main.xml и MainActivity, создал row.xml , который определяет, как будет выглядеть каждая строка внутри RecyclerView, а также создает и привязывает пользовательский адаптер, расширяющий RecyclerView.Adapter. с необходимыми методами. Мой код размещен ниже ->

<!-- This is row.xml -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:id="@+id/container
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setBackgroundColor(int)' on a null object reference
                  at com.example.android.mediasession.ui.auxillary.MyRecycleAdapter.onBindViewHolder(MyRecycleAdapter.java:67)
                  at com.example.android.mediasession.ui.auxillary.MyRecycleAdapter.onBindViewHolder(MyRecycleAdapter.java:15)
                  at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
                  at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
                  at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
                  at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
                  at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
                  at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
                  at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
                  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
                  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
                  at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3225)
                  at android.view.View.measure(View.java:21103)
                  at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1210)
                  at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:1550)
                  at android.view.View.measure(View.java:21103)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6462)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                  at android.view.View.measure(View.java:21103)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6462)
                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                  at android.view.View.measure(View.java:21103)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6462)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                  at com.android.internal.policy.DecorView.onMeasure(DecorView.java:858)
                  at android.view.View.measure(View.java:21103)
                  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2573)
                  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1632)
                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1883)
                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1512)
                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7094)
                  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927)
                  at android.view.Choreographer.doCallbacks(Choreographer.java:702)
                  at android.view.Choreographer.doFrame(Choreographer.java:638)
                  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6836)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
row" android:layout_height="@dimen/media_item_height"> <ImageView android:id="@+id/cover_art" android:layout_width="80dp" android:layout_height="match_parent" android:layout_marginEnd="50dp" android:background="@color/colorPrimary" android:contentDescription="@string/play_item" android:src="@drawable/ic_action_name" /> <LinearLayout android:id="@+id/text_container" android:layout_width="200dp" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/title" tools:text="The Best Music EVAH1111 FOREVER YOUNG I'M SOME!!!11^H^H" android:layout_width="fill_parent" android:layout_height="wrap_content" android:maxLines="1" android:ellipsize="end" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="?android:attr/textColorPrimary"/> <TextView android:id="@+id/author" tools:text="John Doe, his brothers, his sisters, his pets and his more than amazing band" android:layout_width="fill_parent" android:layout_height="wrap_content" android:maxLines="1" android:ellipsize="end" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary"/> </LinearLayout>

this is Adapter class

public class MyRecycleAdapter extends 
RecyclerView.Adapter<MyRecycleAdapter.ViewHolder> {

// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {

    private final TextView  mAuthor, mTitle;
    private final ImageView aCover;
    private final LinearLayout textContainer;

    public ViewHolder(View v) {
        super(v);

        // Define click listener for the ViewHolder's View.
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d(TAG, "onClick: Element " + getAdapterPosition() + " clicked.");
            }
        });
        this.textContainer = v.findViewById(R.id.text_container);
        this.mAuthor = v.findViewById(R.id.author);
        this.mTitle = v.findViewById(R.id.title);
        this.aCover = v.findViewById(R.id.cover_art);
    }
    private TextView getTitle() {
        return mTitle;
    }
    private TextView getAuthor() {
        return mAuthor;
    }
    private ImageView getaCover() {
        return aCover;
    }
}

// Provide a suitable constructor (depends on the kind of dataset)
public MyRecycleAdapter() {
     //mDataset = myDataset;
}


@NonNull
@Override
// Create new views (invoked by the layout manager)
public MyRecycleAdapter.ViewHolder onCreateViewHolder(
        @NonNull ViewGroup parent,
        int viewType) {

    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
    Log.d(TAG, "onCreateViewHolder: layoutInflator = ");

    // create a new view
    View v = layoutInflater.inflate(R.layout.row, parent, false);

    return new ViewHolder(v);
}

// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(final MyRecycleAdapter.ViewHolder viewHolder,
                              final int position) {
    Log.d(TAG, "Element " + position + " set.");

    // - get element from your dataset at this position
    // - replace the contents of the view with that element
    viewHolder.getaCover().setBackgroundColor(Color.RED);
    viewHolder.getAuthor().setText("John Doe, his brothers, his sisters");
    viewHolder.getTitle().setText("The Best Music EVAH1111");
}

@Override
// Return the size of your dataset (invoked by the layout manager)
public int getItemCount() {
    return 4;
}
}

Это в MainActivity

mRecyclerView = findViewById(R.id.recycler);

    // Setting improve's performance if changes in content don't alter RecyclerView layout size
    mRecyclerView.setHasFixedSize(true);

    // use a linear layout manager
    mLayoutManager = new LinearLayoutManager(MainActivity.this);
    mRecyclerView.setLayoutManager(mLayoutManager);

    // not necessary to achieve goal
    // String[] mew = new String[]{"mew", "two"};

    // specify an adapter (see also next example)
    mAdapter = new MyRecycleAdapter(mew);
    mRecyclerView.setAdapter(mAdapter);

Мой вопрос: когда я запускаю приложение, RecyclerView.Adapter onBindViewHolder() не распознает дочерние представления внутри держателя родительского представления (который ссылается на row.xml)... .i Не знаю, почему это не так, потому что раньше у меня не было проблем, когда я запускал его без вставки каких-либо литералов или присвоения нуля моему изображению, он строился правильно, а теперь он случайным образом настраивается. Я пытался сделать недействительным/очистить кеш и перезапустить AS (не устранил проблемы), я также попытался создать новый фиктивный проект, скопировать и вставить свой код, запустил его без каких-либо проблем, но у меня есть проблемы в моем основном проекте, который много файлов/вспомогательных классов и т. д. и т. д.

Ниже приведен журнал ошибок

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setBackgroundColor(int)' on a null object reference
                  at com.example.android.mediasession.ui.auxillary.MyRecycleAdapter.onBindViewHolder(MyRecycleAdapter.java:67)
                  at com.example.android.mediasession.ui.auxillary.MyRecycleAdapter.onBindViewHolder(MyRecycleAdapter.java:15)
                  at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
                  at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
                  at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
                  at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
                  at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
                  at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
                  at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
                  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
                  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
                  at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3225)
                  at android.view.View.measure(View.java:21103)
                  at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1210)
                  at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:1550)
                  at android.view.View.measure(View.java:21103)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6462)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                  at android.view.View.measure(View.java:21103)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6462)
                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                  at android.view.View.measure(View.java:21103)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6462)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                  at com.android.internal.policy.DecorView.onMeasure(DecorView.java:858)
                  at android.view.View.measure(View.java:21103)
                  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2573)
                  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1632)
                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1883)
                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1512)
                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7094)
                  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927)
                  at android.view.Choreographer.doCallbacks(Choreographer.java:702)
                  at android.view.Choreographer.doFrame(Choreographer.java:638)
                  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6836)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

Приложение прекращено.


person Alyosha_Karamazov    schedule 02.05.2018    source источник
comment
Так в чем вопрос?   -  person noman404    schedule 02.05.2018
comment
@AndrewMyers, код опубликован, я все еще работаю над этой проблемой, я знаю, что она должна работать, поскольку мой POC работал, когда я создавал, и в конечном итоге удалю фиктивный проект / приложение, но для меня жизнь не будет работать на моем оригинальный проект .... это тип ошибки в AS? это нормально происходит? или это случилось с кем-то из вас?   -  person Alyosha_Karamazov    schedule 02.05.2018
comment
doesnt recognize the child views inside the parent view holder какую ошибку вы видите?   -  person Sagar    schedule 02.05.2018
comment
@Sagar Я разместил журнал ошибок, но имейте в виду, что никаких проблем не возникло, когда я создал новое приложение и скопировал/вставил код/файлы, которые были необходимы для просмотра списка RecyclerVIew, содержащего 4 строки, состоящие из одного и того же изображения и двух текстовых изображений   -  person Alyosha_Karamazov    schedule 02.05.2018
comment
У вас есть несколько папок res/layout*/, где вы, возможно, создали row в одной без этих View?   -  person Mike M.    schedule 02.05.2018
comment
@МайкМ. да, у меня есть row.xml _layout в папке по умолчанию и в папке v-21, может ли это повлиять на это? у меня есть дочерние представления макета _row.xml по умолчанию, которым назначены разные ((Id **, чем 'v21'   -  person Alyosha_Karamazov    schedule 02.05.2018
comment
Они оба точно такие, как вы написали выше; то есть со всеми View с одинаковыми идентификаторами? Кроме того, для v21+ обязательно нужна другая версия?   -  person Mike M.    schedule 02.05.2018
comment
Да, они должны иметь одинаковые идентификаторы. Обратите внимание, что ваш код не ищет разные идентификаторы в зависимости от версии.   -  person Mike M.    schedule 02.05.2018
comment
@МайкМ. Черт возьми, Бэтмен!!??, я обновил версию 21, чтобы она соответствовала моей папке по умолчанию, и теперь она работает! Я не уверен, нужна ли мне другая версия для v21+, я думал, что это было случайное создание папки v21, потому что на данный момент я не знаю, для какой цели она служит, .... опубликую ответ, и теперь, есть ли способ проголосовать за ваш комментарий?   -  person Alyosha_Karamazov    schedule 02.05.2018
comment
Вам понадобится макет v21, если вы хотите использовать вещи в версиях Android 21+, которые не были представлены до версии v21 (Lollipop); например, ColorStateLists вместо tints, атрибуты, характерные для дизайна материалов, и т. д. Я не могу быть уверен, нужен ли вам этот отдельный макет, но возможно, что ваша IDE автоматически сгенерировала его для вас, как часть выбранного вами шаблона проекта. . Во всяком случае, нет необходимости голосовать за мой комментарий. Во всяком случае, мало что делает. :-) Рад, что у вас все получилось. Ваше здоровье!   -  person Mike M.    schedule 02.05.2018


Ответы (3)


Как отметил @Mike M. в комментариях,

У вас есть несколько папок res/layout*/, где вы, возможно, создали строку в одной без этих представлений? Если да, то они оба точно такие, как вы написали выше; т. е. со всеми представлениями с одинаковыми идентификаторами? Кроме того, для v21+ обязательно нужна другая версия?

У меня было две разные папки, содержащие один и тот же макет, папку макета по умолчанию и папку v21, однако идентификаторы моего представления и некоторые родительские LayoutViews не совпадали, после того как я обновил их, чтобы отразить точную копию в обеих папках, мое приложение работало как чудо-андер

person Alyosha_Karamazov    schedule 02.05.2018

вы передаете два значения

String[] mew = new String[]{"mew", "two"}; 

и попытка сгенерировать 4 строки может привести к исключению indexOutOfBounds Exception

@Override
public int getItemCount() {
    return 4;//use your mDataset's size.
}
person noman404    schedule 02.05.2018
comment
я специально поместил 4 в качестве количества элементов в методе getItemCount(). я также вставил фиктивные тексты в текстовые представления автора и заголовка в onBindViewHolder() - person Alyosha_Karamazov; 02.05.2018

Внутри вашего onBindViewHolder есть небольшая ошибка,

Обновите следующий код, я исправил его.

viewHolder.aCover.setBackgroundColor(Color.RED);
viewHolder.mAuthor.setText("John Doe, his brothers, his sisters"); viewHolder.mTitle.setText("The Best Music EVAH1111");

Вы имели в виду неправильное представление. Это вызывало ошибку.

Обновите и дайте мне знать, если проблема будет решена.

person Amir Dora.    schedule 02.05.2018
comment
нет, это было не так, на самом деле у меня было две разные папки макета с несовпадающим идентификатором представления, @mikeM указал на это в комментариях выше. - person Alyosha_Karamazov; 02.05.2018