it-swarm.com.ru

Сбой приложения при попытке использовать RecyclerView на Android 5.0

Я пытаюсь связываться с новым RecyclerView, и всякий раз, когда я пытаюсь запустить его, мое приложение немедленно вылетает. Это дает мне NullPointerException за попытку доступа к методам из Android.support.v7.widget.RecyclerView. Я просмотрел другие посты и увидел, что у большинства людей нет compile 'com.Android.support:recyclerview-v7:+', но я попробовал это, и это совсем не помогло. Не совсем уверен, что делать на этом этапе, любая помощь будет принята с благодарностью. Вот журнал ошибок: (Я бы опубликовал картинку, но у меня еще нет 10 повторений)

Java.lang.NullPointerException: Attempt to invoke virtual method 'void Android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(Android.support.v7.widget.RecyclerView$Recycler, Android.support.v7.widget.RecyclerView$State, int, int)' on a null object reference
        at Android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.Java:1764)
        at Android.view.View.measure(View.Java:17430)
        at Android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.Java:727)
        at Android.widget.RelativeLayout.onMeasure(RelativeLayout.Java:463)
        at Android.view.View.measure(View.Java:17430)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
        at Android.view.View.measure(View.Java:17430)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
        at Android.view.View.measure(View.Java:17430)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1436)
        at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:722)
        at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:613)
        at Android.view.View.measure(View.Java:17430)
        at Android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.Java:851)
        at Android.view.View.measure(View.Java:17430)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
        at Android.view.View.measure(View.Java:17430)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1436)
        at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:722)
        at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:613)
        at Android.view.View.measure(View.Java:17430)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
        at Android.view.View.measure(View.Java:17430)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1436)
        at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:722)
        at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:613)
        at Android.view.View.measure(View.Java:17430)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
        at com.Android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.Java:2560)
        at Android.view.View.measure(View.Java:17430)
        at Android.view.ViewRootImpl.performMeasure(ViewRootImpl.Java:2001)
        at Android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.Java:1166)
        at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1372)
        at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1054)
        at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5786)
        at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:767)
        at Android.view.Choreographer.doCallbacks(Choreographer.Java:580)
        at Android.view.Choreographer.doFrame(Choreographer.Java:550)
        at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:753)
        at Android.os.Handler.handleCallback(Handler.Java:739)
        at Android.os.Handler.dispatchMessage(Handler.Java:95)
        at Android.os.Looper.loop(Looper.Java:135)
        at Android.app.ActivityThread.main(ActivityThread.Java:5221)
        at Java.lang.reflect.Method.invoke(Native Method)
        at Java.lang.reflect.Method.invoke(Method.Java:372)
        at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:898)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:693)
89
Joe

Эта проблема обычно возникает, когда для LayoutManager не было указано RecyclerView . Вы можете сделать это так: 

final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
210
aga

В моем случае это было связано не с «финалом», а с проблемой, упомянутой в комментарии @ NemanjaKovačević к ответу @aga…. Я настраивал layoutManager при загрузке данных, и это было причиной того же сбоя. После перемещения настройки layoutManager в onCreateView моего фрагмента проблема была исправлена.

Что-то вроде этого:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
{
...
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler);

mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);
26
YuriK

У меня возникла та же проблема, проблема заключалась в том, что в xml был неиспользованный RecyclerView с отсутствующим представлением, но я не привязываю его к какому-либо адаптеру в Activity, поэтому проблема. Это было решено, как только я удалил такие неиспользуемые представления переработчика в XML

я удалил это представление, так как это не было вызвано в коде или был установлен какой-либо адаптер

<Android.support.v7.widget.RecyclerView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:id="@+id/rv_profileview_allactivities"
        Android:visibility="gone" />
10
Maurice

Я столкнулся с этим сбоем, хотя у меня был правильно установлен RecyclerView.LayoutManager. Мне пришлось переместить код инициализации RecyclerView в обратный вызов onViewCreated(...), чтобы решить эту проблему.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_listing, container, false);
    rootView.setTag(TAG);
    return inflater.inflate(R.layout.fragment_listing, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    mLayoutManager = new LinearLayoutManager(getActivity());
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mRecyclerView.setLayoutManager(mLayoutManager);

    mAdapter = new ListingAdapter(mListing);
    mRecyclerView.setAdapter(mAdapter);
}
8
Shirish Kamath

Вам необходимо использовать setLayoutManager в методе RecyclerView#onCreate(). Перед добавлением recyclerView в представление должно быть установлено LayoutManager.

 private RecyclerView menuAsList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    menuAsList = (RecyclerView) findViewById(R.id.recyclerView_mainMenu);
    menuAsList.setLayoutManager(new LinearLayoutManager(Home.this));

}
4
katwal-Dipak
recyclerView =
            (RecyclerView) findViewById(R.id.recycler_view2);

Сверьтесь с вашим идентификатором вида переработчика, указывая на фактический вид переработчика, решив мою проблему

2
iam_muqshid

Моя проблема была в моем XML lyout. У меня Android: animateLayoutChanges установлен в true, и я вызвал notifyDataSetChanged () на адаптере RecyclerView в коде Java.

Итак, я только что удалил Android: animateLayoutChanges из моего макета, и это решило мою проблему.

1
Ahlem Jarrar

Я получил эту проблему из-за неправильной ссылки RecyclerView id.

recyclerView = (RecyclerView) findViewById(R.id.rv_followers_list);

в

recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);
1
Stephen

Я думаю, что проблема в вашей Adapter. Убедитесь, что вы вернули ViewHolder в onCreateViewHolder(). Как показано ниже:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v;
    v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_leaderboard, parent, false);
    ViewHolder view_holder = new ViewHolder(v);
    return view_holder;
}
0
Hardik Lakhani

У меня была эта проблема при использовании библиотеки Butterknife . У меня было:

View rootView = inflater.inflate
                (R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(rootView);

Но правильная версия:

View rootView = inflater.inflate
                (R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(this, rootView);
0
Ivars Briedis

Я использовал Dependency Injection - ButterKnife , и эта проблема возникла из-за того, что я не связал представление.

Так внутри onCreate () я просто вставил эту строку:

ButterKnife.bind(this);

Моя декларация RecyclerView с внедрением зависимостей:

@BindView(R.id.recyclerview)
RecyclerView recyclerView;
0
rohegde7

Поскольку LinearLayoutManager по умолчанию является вертикальным, более простой способ сделать это:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Если вы хотите изменить ориентацию, вы можете использовать этот конструктор:

public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);
0
l-l

В Gradle реализовать эту библиотеку: 

implementation 'com.Android.support:appcompat-v7:SDK_VER'
implementation 'com.Android.support:design:SDK_VER'
implementation 'com.Android.support:support-v4:SDK_VER'
implementation 'com.Android.support:support-v13:SDK_VER'
implementation 'com.Android.support:recyclerview-v7:SDK_VER'

ВXMLупомяните так: 

<Android.support.v7.widget.RecyclerView
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content"
  Android:id="@+id/recyclerView"/>

В фрагмент мы используем recyclerView как это:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       View rootView = inflater.inflate(R.layout.YOUR_LAYOUT_NAME, container, false);

       RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(getActivity(), YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);
        return rootView;
    }

В Activity мы используем RecyclerView вот так:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YOUR_LAYOUT_NAME);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);
   }

если вам нужно по горизонтали RecyclerView сделайте это:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);

если вы хотите использовать GridLayoutManager используя RecyclerView используйте вот так:

        RecyclerView recyclerView = findViewById(R.id.rvNumbers);
        recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); // 3 is number of columns.
        adapter = new MyRecyclerViewAdapter(this, data);
        recyclerView.setAdapter(adapter);
0
Abhinav Gupta

Для меня проблема была с моим activity_main.xml (21), в котором у recycleView не было идентификатора.

activity_main.xml (21)

 <Android.support.v7.widget.RecyclerView
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:layout_marginStart="8dp"
    Android:layout_marginLeft="8dp"
    Android:layout_marginTop="8dp"
    Android:layout_marginEnd="8dp"
    Android:layout_marginRight="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button3"
    tools:listitem="@layout/transaction_list_row" />

activity_main.xml

<Android.support.v7.widget.RecyclerView

    Android:id="@+id/transac_recycler_view"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:layout_marginStart="8dp"
    Android:layout_marginLeft="8dp"
    Android:layout_marginTop="8dp"
    Android:layout_marginEnd="8dp"
    Android:layout_marginRight="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button3"
    />

Это сработало, когда я добавил Android: id = "@ + id/transac_recycler_view" в activity_main.xml (21) recycleView

0
DAVID KATHOH