O aplicativo falha ao tentar usar o RecyclerView no Android 5.0

90

Estou tentando mexer com o novo RecyclerView e sempre que tento executá-lo, meu aplicativo trava imediatamente. Isso me dá NullPointerException para tentar acessar métodos de android.support.v7.widget.RecyclerView. Eu olhei para outros posts e vi que a maioria das pessoas não tinha, compile 'com.android.support:recyclerview-v7:+'mas eu tentei e não ajudou em nada. Não tenho certeza do que fazer neste momento, qualquer ajuda seria apreciada. Aqui está o log de erros: (Eu postaria uma foto, mas ainda não tenho 10 repetições)

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)
Joe
fonte
para quem tiver esse erro causado pelas guias do Viewpager, veja esta solução
Hassan Gilak
Você resolveu isso? .Por favor, ajude. Estou tendo o mesmo problema
Sagar
Lembre-se de definir / criar / registrar no onCreateViewque você remove / destrói / cancela o registro em onDestroyView... Tenho que seguir esses ciclos de vida!
Sakiboy

Respostas:

211

Esse problema geralmente ocorre quando nenhum LayoutManagerarquivo foi fornecido para o RecyclerView. Você pode fazer assim:

final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
aga
fonte
14
Não acho que precise ser definitivo, então não acho que esse seja o problema. No meu caso, estava implementando um fragmento com recyclerView e tentei apenas reter uma referência a ele de onCreateView e definir um layoutManager mais tarde, quando os dados forem carregados. Eu tive esse problema e ele foi embora quando configurei o layoutManager anteriormente no método gamein onCreateView.
Nemanja Kovacevic
3
@ NemanjaKovačević bem, suponho que toda variável que não precisa ser alterada posteriormente deve ser declarada como final, é por isso que eu declarei finalaqui.
aga
2
Como LinearLayoutManager é vertical por padrão, você pode usar: recyclerView.setLayoutManager (new LinearLayoutManager (context));
11 de
1
Graças a Deus, podemos pesquisar no Google as mesmas mensagens de erro criadas pelo Google para dar sentido a elas.
jhegedus
1
@wesleyfranks, é difícil dizer por que você está obtendo referência de objeto nulo sem olhar para 1. o código que configura o RecyclerView e 2. o rastreamento de pilha que você está obtendo após o travamento. :)
aga
26

No meu caso, não estava conectado a 'final', mas ao problema mencionado no comentário de @ NemanjaKovačević à resposta de @aga. Eu estava configurando um layoutManager na carga de dados e essa foi a causa da mesma falha. Depois de mover a configuração do layoutManager para onCreateView do meu fragmento, o problema foi corrigido.

Algo assim:

@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);
YuriK
fonte
1
Mais uma vez: não digo que esse problema esteja de alguma forma relacionado à variável não ser final. O problema é queLayoutManager não foi fornecido , é isso. Você pode fazer com que a variável aponte para o LayoutManagerfinal ou não - isso não muda nada.
aga
@Yurik estou usando o recyclerview em Activity not on fragment. qual é o caso para mim?
Youri de
@Youri, você deve apenas colocar a configuração layoutManager no onCreate de sua atividade, eu acho.
YuriK
10

Para mim, eu estava tendo o mesmo problema, o problema era que havia um RecyclerView não utilizado em xml sem visualização, mas não estou vinculando-o a nenhum adaptador em Activity, daí o problema. Foi resolvido assim que removi as visualizações não utilizadas do reciclador no xml

ou seja - eu removi esta visão porque ela não foi chamada no código ou qualquer adaptador foi configurado

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rv_profileview_allactivities"
        android:visibility="gone" />
Maurice
fonte
Mesmo aqui tudo estava perfeito, mas não estava funcionando. Portanto, removi as visualizações de reciclagem não utilizadas e funcionou sem problemas. Obrigado cara @Maurice ^^
Bhupinder
1
depois de perder um dia tentei sua solução e funcionou: D [:( meu tempo foi desperdiçado]
mfaisalhyder
8

Eu experimentei esta falha, embora eu tivesse o RecyclerView.LayoutManagerajuste correto. Tive que mover o RecyclerView código de inicialização para o onViewCreated(...)retorno de chamada para corrigir esse problema.

@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);
}
Shirish Kamath
fonte
2
Mesmo assim, meu problema não foi resolvido: / tentei quase todas as soluções e ainda obtive o mesmo erro ao usar o RecyclerView dentro de um fragmento a ser mostrado no PagerView :(
mfaisalhyder
Impressionante! Movendo o RecyclerViewcódigo de inicialização para o onViewCreated(...) trabalhado
Marcelo Gracietti
Eu fiz essa solução, e ainda era nula para mim. Ainda estou tentando descobrir onde.
wesley franks de
5

Você precisa usar setLayoutManagerno RecyclerView#onCreate()método. Antes de adicionar recyclerViewa uma vista, deve ter o LayoutManagerconjunto.

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

}
Katwal-Dipak
fonte
3

Eu tenho esse problema devido à referência errada de RecyclerViewid.

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

para

recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);
Steve
fonte
2
recyclerView =
            (RecyclerView) findViewById(R.id.recycler_view2);

Verifique com seu ID de visualização do reciclador, apontando para a visualização real do reciclador resolveu meu problema

iam_muqshid
fonte
1

Meu problema estava em meu lyout XML. Tenho um android: animateLayoutChanges definido como true e chamei notificarDataSetChanged () no adaptador do RecyclerView no código Java.

Então, acabei de remover android: animateLayoutChanges do meu layout e resolvi meu problema.

Ahlem Jarrar
fonte
1

Eu tive esse problema ao usar a biblioteca Butterknife. Eu tinha:

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

Mas a versão correta é:

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

No Gradle, implemente esta biblioteca:

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'

Em XML, menção como esta:

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

Em Fragment , usamos recyclerViewassim:

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

Na atividade , usamos RecyclerViewassim:

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

se precisar horizontal, RecyclerView faça o seguinte:

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

se você quiser usar GridLayoutManager usando o RecyclerViewseguinte:

        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);
Abhinav Gupta
fonte
1

Eu estava usando uma injeção de dependência - ButterKnife e esse problema surgiu porque eu não tinha vinculado a visão.

Então, dentro de onCreate (), acabei de inserir esta linha:

ButterKnife.bind(this);

Minha declaração RecyclerView com injeção de dependência:

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

Para aqueles que estão usando: implementação 'androidx.recyclerview: recyclerview: 1.1.0-beta05'

certifique-se de usar isso em seu layout xml

Também tive uma falha ao executar meu aplicativo abaixo da API 27. Aqui está um link para a mensagem

Originalmente, eu criei um estilo para alterar o tamanho da fonte do meu textview dentro do recyclerview é por isso que criei este código abaixo: (eu poderia apenas ter chamado @dimen ao alterar o tamanho da fonte com base nos tamanhos de tela)

Inside style.xml

e adicionei isso no meu tema

themes.xml

Depois de investigar, descobri que é isso que está causando o erro e, após remover o estilo, não estou mais tendo problemas.

Eu tentei todas as soluções possíveis que encontrei aqui no estouro de pilha e quase desisti disso, felizmente na minha curiosidade pensei por que não remover o estilo talvez isso cause o crash e então boom o crash acabou.

Jeanne vie
fonte
1
Inclua exemplos de código diretamente em vez de vincular a imagens. Dê uma olhada na seção "Ajude outros a reproduzir o problema": stackoverflow.com/help/how-to-ask
Chris B
1
Eu realmente sou a favor deste @ChrisB. Esta é a primeira vez que coloco um comentário aqui, pois minha reputação é muito baixa, como você pode ver. Eu encontrei o travamento hoje e estava pensando em postar aqui, pois talvez haja pessoas que também estão enfrentando isso, especialmente porque estão usando 'androidx.recyclerview: recyclerview: 1.1.0-beta05'.
Jeanne vie
0

Como LinearLayoutManager é vertical por padrão, uma maneira mais fácil de fazer isso é:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Se você quiser mudar a orientação, pode usar este construtor:

public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);
tudo
fonte
tendo um estranho gerenciador de layout issulinear agora. estou instanciando-o, mas ainda ge esse erro. vaca sagrada.
filthy_wizard
0

Acho que o problema no seu Adapter. Certifique-se de que você voltou ViewHolderem onCreateViewHolder(). Como abaixo:

@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;
}
Android Dev
fonte
0

Para mim, o problema era com meu activity_main.xml (21) em que o recycleView não tinha um id.

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"
    />

Funcionou quando adicionei um android: id = "@ + id / transac_recycler_view" ao activity_main.xml (21) recycleView

David Kathoh
fonte
0

No meu caso, adicionei apenas a biblioteca butterknife e esqueci de adicionar annotationProcessor. Ao adicionar a linha abaixo ao build.gradle (módulo App), resolvi meu problema.

    annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
Pooja
fonte
0

Recyclerview recylerview = findbyid (R.id.recyclerview) Pode ser que você tenha perdido

Sadique Khan
fonte
Olá, bem-vindo ao SO! Explique um pouco mais por que isso é relevante para esta questão. Como está escrito atualmente, é difícil dizer a que você está se referindo.
Piotr Kamoda
0

Tive um problema semelhante ao testar meu aplicativo no GenyMotion. Após reiniciar o aparelho no GenyMotion o problema foi resolvido

Yurii Mikhailichenko
fonte
0

Enfrentei o mesmo problema porque tinha o RecyclerView em outro layout e não em activity_main.xml.

Ao pesquisar em alguns sites, encontrei algo e quis compartilhar aqui

  1. Adicionar Id para incluir a tag em Activity_main.xml

    <include id="includedRecyclerLayout" .... </include>

  2. chame este layout antes de Pesquisar visualização por ID em MainActivity.java

    `ConstraintLayout includedLayout = findViewById (R.id.inckudedRecyclerLayout);

    RecyclerViewrecyclerview = includedLayout.findViewById (R.id.RECYCLER_VIEW_ID) `;

Nupoor
fonte
-1

Se eu estiver onde você farei isso. onView (withId (android.R.id.list)). perform (RecyclerViewActions.scrollToPosition (3)); android.R.id.list altere-o para o id da lista e a posição será a sua posição dentro do array.

Keti
fonte
-1

usando fragmento

escrever código em onCreateView ()

RecyclerView recyVideo = view.findViewById (R.id.recyVideoFag);

usando atividade

escrever código em onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag);

sajid
fonte