Попытка чтения из поля 'android .view.View androidx.recyclerview.widget.RecyclerView $ ViewHolder.itemView' для ссылки на пустой объект - PullRequest
2 голосов
/ 23 апреля 2020

Я создаю приложение, которое получает данные из sql и переводит их в представление рециркуляции. Сначала я попробовал это в виде списка, но в режиме рециркуляции мне показалось, что это проще, так или иначе, это в основном приложение системы чата, когда я добавляю свои данные в окно рециркуляции, это выдает мне эту ошибку в logcat.

 java.lang.NullPointerException: Attempt to read from field
       'android.view.View
       androidx.recyclerview.widget.RecyclerView$ViewHolder.itemView' on a
       null object reference
               at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7079)
               at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6235)
               at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
               at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
               at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
               at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
               at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
               at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
               at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
               at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
               at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
               at android.view.View.layout(View.java:18010)
               at android.view.ViewGroup.layout(ViewGroup.java:5817)
               at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
               at android.view.View.layout(View.java:18010)
               at android.view.ViewGroup.layout(ViewGroup.java:5817)
               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)
               at android.widget.FrameLayout.onLayout(FrameLayout.java:281)
               at android.view.View.layout(View.java:18010)
               at android.view.ViewGroup.layout(ViewGroup.java:5817)
               at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:444)
               at android.view.View.layout(View.java:18010)
               at android.view.ViewGroup.layout(ViewGroup.java:5817)
               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)
               at android.widget.FrameLayout.onLayout(FrameLayout.java:281)
               at android.view.View.layout(View.java:18010)
               at android.view.ViewGroup.layout(ViewGroup.java:5817)
               at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742)
               at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
               at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)

Пожалуйста, помогите, потому что это не дает мне никакой подсказки, откуда берется ошибка или тому подобное.

вот мой класс адаптера:

public class MyAppAdapter extends 

RecyclerView.Adapter<MyAppAdapter.ViewHolder>//has a class viewholder which holds
        {
            private ArrayList<ClassListChat> mOriginalValues; // Original Values
            private ArrayList<ClassListChat> mDisplayedValues;

            public class ViewHolder extends RecyclerView.ViewHolder {

                TextView messageText;
                TextView messageUser;
                TextView messageTime;

                public ViewHolder(@NonNull View itemView) {
                    super(itemView);
                }
            }

            public List <ClassListChat> parkingList;

            public Context context;
            ArrayList<ClassListChat> arraylist;


            private MyAppAdapter(List<ClassListChat> apps, Context context) {
                this.parkingList = apps;
                this.context = context;
                arraylist = new ArrayList<ClassListChat>();
                arraylist.addAll(parkingList);
            }



            @Override
            public MyAppAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
                View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.listcontentstorechat,parent,false);
                ViewHolder viewHolder = new ViewHolder(rowView);
                if (rowView == null) {
                    LayoutInflater inflater = getLayoutInflater();
                    rowView = inflater.inflate(R.layout.listcontentstorechat, parent, false);
                    viewHolder.messageText = (BubbleTextView) rowView.findViewById(R.id.message_text);
                    viewHolder.messageUser = (TextView) rowView.findViewById(R.id.message_user);
                    viewHolder.messageTime = (TextView) rowView.findViewById(R.id.message_time);
                    rowView.setTag(viewHolder);
                } else {
                    viewHolder = (ViewHolder) rowView.getTag();
                }
                // here setting up names and images




                return viewHolder;
            }

            @Override
            public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
                holder.messageText.setText(parkingList.get(position).getMessageText());
                holder.messageUser.setText(parkingList.get(position).getMessageUser());
                holder.messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)", parkingList.get(position).getMessageTime()));
            }

            @Override
            public int getItemCount() {
                return itemArrayList.size();
            }
        }


I would really appreciate your hard work in helping me!!

РЕДАКТИРОВАТЬ: теперь он просто дает мне пустой bubbleTextView (который я реализовал в своем приложении), но он не показывает текст, ни время, ни у пользователя какие-либо идеи?

Вот мой список контекстаtorechat. xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:id="@+id/message_user"
        android:textStyle="normal|bold"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_alignParentBottom="@+id/message_user"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:id="@+id/message_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <com.github.library.bubbleview.BubbleTextView
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="5dp"
        android:layout_below="@id/message_user"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1"
        android:textColor="#FFF"
        android:textSize="18sp"

        android:id="@+id/message_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        app:arrowWidth="8dp"
        app:angle="8dp"
        app:arrowHeight="10dp"
        app:arrowPosition="14dp"
        app:arrowLocation="left"
        app:bubbleColor="#333639"
        app:arrowCenter="true"
        />

</RelativeLayout>

А вот мой ClassListChat. java

public class ClassListChat {
    public String messageText;
    public String messageUser;
    public long messageTime;


    public ClassListChat(String messageText, String messageUser) {
        this.messageText = messageText;
        this.messageUser = messageUser;
        messageTime = new Date().getTime();
    }

    public ClassListChat() {
    }

    public String getMessageText() {
        return messageText;
    }

    public void setMessageText(String messageText) {
        this.messageText = messageText;
    }

    public String getMessageUser() {
        return messageUser;
    }

    public void setMessageUser(String messageUser) {
        this.messageUser = messageUser;
    }

    public long getMessageTime() {
        return messageTime;
    }

    public void setMessageTime(long messageTime) {
        this.messageTime = messageTime;
    }

РЕДАКТИРОВАТЬ 2: После некоторых улучшений теперь в logcat возвращается ошибка:

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
        at com.example.medicnes.ChatActivity$MyAppAdapter.onBindViewHolder(ChatActivity.java:275)
        at com.example.medicnes.ChatActivity$MyAppAdapter.onBindViewHolder(ChatActivity.java:225)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

ViewHolder всегда не равно нулю в onCreateViewHolder(), так как View, созданный в этом методе, не может быть нулевым.

onCreateViewHolder() построен не так, как getView(), который вы используете для создания ListView адаптера

Итак, пожалуйста, измените onCreateViewHolder на

        @Override
        public MyAppAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
            View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.listcontentstorechat,parent,false);
            ViewHolder viewHolder = new ViewHolder(rowView);

            return viewHolder;
        }

Редактировать: теперь (и до того, как на самом деле) он не добавляет текст в представление корзины. Я обновил свой вопрос

Вы вернули неправильный размер списка из getItemCount(), так как ваш адаптер использует arraylist в качестве списка данных, поэтому вам нужно вернуть его размер

Поэтому измените getItemCount() на

@Override
 public int getItemCount() {
     if (arraylist != null)
         return arraylist.size();
     else
         return 0;
 }

Редактировать 2:

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
        at com.example.medicnes.ChatActivity$MyAppAdapter.onBindViewHolder(ChatActivity.java:275)
        at com.example.medicnes.ChatActivity$MyAppAdapter.onBindViewHolder(ChatActivity.java:225)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)

Вы не инициализировали представления в пределах макет элемента строки с использованием .findViewById(), поэтому измените конструктор ViewHolder на

public ViewHolder(@NonNull View itemView) {
    super(itemView);
    messageText = itemView.findViewById(R.id.message_text);
    messageUser = itemView.findViewById(R.id.message_user);
    messageTime = itemView.findViewById(R.id.message_time);
}
0 голосов
/ 23 апреля 2020

Ваш адаптер возвращает нулевые видоискатели.

View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.listcontentstorechat,parent,false);

rowView здесь всегда не равно нулю, поэтому это условие:

if (rowView == null) {

никогда не срабатывает, и вместо этого код переходит в другую ветку

} else {
    viewHolder = (ViewHolder) rowView.getTag();
}

, которая заменяет viewHolder на ноль, и вы возвращаете это.

Эта часть код выглядит как попытка адаптировать старый адаптер ListView к адаптеру RecyclerView. Вам не нужно setTag() / getTag() самостоятельно с RecyclerView.

Просто создайте и инициализируйте держатель представления и верните его из метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...