26

Tak więc mój kod po prostu tworzy listę CardViews za pomocą RecyclerView. Po uruchomieniu mojego kodu otrzymałem dziwny błąd, twierdząc, że wystąpił błąd w moim xml. Po krótkim majstrowaniu odkryłem, że w moim pliku układu, jeśli zmienię <RecyclerView> na <android.support.v7.widget.RecyclerView>, wszystko będzie działało dobrze. Dlaczego to się dzieje?
Moja aktywność.Błąd zawyżania klasy RecyclerView

import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.Menu; 
import android.view.MenuItem; 

import java.util.ArrayList; 


public class CardListActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_card_list); 
     RecyclerView recyclerView = (RecyclerView)findViewById(R.id.cardList); 
     recyclerView.setHasFixedSize(true); 

     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); 
     linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(linearLayoutManager); 

     ArrayList<String> list = new ArrayList<>(); 
     for(int i = 0; i < 20; i++) {list.add("Item " + i);} 
     CardListAdapter cardListAdapter = new CardListAdapter(list); 
     recyclerView.setAdapter(cardListAdapter); 
    } 

} 


Moja Adapter

import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.util.List; 

public class CardListAdapter extends RecyclerView.Adapter<CardListAdapter.CardListViewHolder> { 

    private List<String> list; 

    public CardListAdapter(List<String> list) { 
     this.list = list; 
    } 

    @Override 
    public CardListViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_layout,viewGroup,false); 
     return new CardListViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(CardListViewHolder cardListViewHolder, int i) { 
     String s = list.get(i); 
     cardListViewHolder.title.setText(s); 
    } 

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


    public static class CardListViewHolder extends RecyclerView.ViewHolder { 
     TextView title; 
     public CardListViewHolder(View itemView) { 
      super(itemView); 
      title = (TextView)itemView.findViewById(R.id.title); 
     } 
    } 

} 


Mój plik układ, uwaga, zmiana <RecyclerView> do <android.support.v7.widget.RecyclerView> poprawki błędu.

<RelativeLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".CardListActivity"> 

<RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/cardList"> 

    </RecyclerView> 

Kiedy biegnę z <RecyclerView> otrzymuję ten błąd.

`Process: com.liquidink.lollipopmaterialui, PID: 7317 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.liquidink.lollipopmaterialui/com.liquidink.lollipopmaterialui.CardListActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class RecyclerView 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      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:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class RecyclerView 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:757) 
      at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
      at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:228) 
      at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:102) 
      at com.liquidink.lollipopmaterialui.CardListActivity.onCreate(CardListActivity.java:18) 
      at android.app.Activity.performCreate(Activity.java:5933) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
            at android.app.ActivityThread.access$800(ActivityThread.java:144) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            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:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.RecyclerView" on path: DexPathList[[zip file "/data/app/com.liquidink.lollipopmaterialui-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 
      at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
      at android.view.LayoutInflater.createView(LayoutInflater.java:571) 
      at android.view.LayoutInflater.onCreateView(LayoutInflater.java:665) 
      at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:65) 
      at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682) 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741) 
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
            at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:228) 
            at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:102) 
            at com.liquidink.lollipopmaterialui.CardListActivity.onCreate(CardListActivity.java:18) 
            at android.app.Activity.performCreate(Activity.java:5933) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
            at android.app.ActivityThread.access$800(ActivityThread.java:144) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            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:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Suppressed: java.lang.ClassNotFoundException: android.view.RecyclerView 
      at java.lang.Class.classForName(Native Method) 
      at java.lang.BootClassLoader.findClass(ClassLoader.java:781) 
      at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:504) 
      ... 26 more 
    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available 

`

Odpowiedz

33

RecyclerView nie jest zawarta w ramach podstawowej Android, tylko widgety w ramach podstawowej Android (jak ListView, GridView etc) mogą być określone w układzie bez pełnej nazw. RecyclerView jest częścią biblioteki wsparcia recyclerview-v7.

4

Upewnij się m.in. przed dodaniem RecyclerView do XML

compile 'com.android.support:recyclerview-v7:22.2.0' 
compile 'com.android.support:appcompat-v7:22.2.0' 

Jeśli utworzono RecyclerView w XML przed dodaniem tych zależności, aby to działało należy usunąć (komentarz) Twój widok recyklingowa, zbuduj projekt bez niego, a następnie dodaj go z powrotem. W przeciwnym razie nadal pokazuje wyjątek w trybie Inflate w binarnej linii XML #n.

+0

I am using eclipse i facing issue .Zrobiłem moje pytanie na: http: //stackoverflow.com/questions/33375943/error-inflating-class-recycler-view? Noredirect = 1 # comment54546208_33375943 Próbowałem twojej sugestii, najpierw włączając w to bibliotekę, a następnie widok recyklingu widget w XML, ale mam do czynienia z tym samym problemem.Can y ou proszę pomóc – ghostrider

32

Należy dodać RecyclerView w formacie XML w ten sposób:

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

</android.support.v7.widget.RecyclerView> 

Nadzieję, że to pomaga!

+0

Nadal będziesz musiał dodać implement'com.android.support: recyclerview-v7: 26.1.0 ' do pliku gradle jako @KuRoSan ER. mówi –

8

Dziś napotykam ten problem. I rozwiązał to.

1-cia step: keep support-libs you used are same version

compile 'com.android.support:appcompat-v7:23.1.1' 
compile 'com.android.support:support-v4:23.1.1' 
compile 'com.android.support:recyclerview-v7:23.1.1' 

2-szy step: you should add recyclerView do your proguard files

-keep class android.support.v7.widget.** {*;} 
// I`ve just keep all widgets 
+1

Żadne z innych rozwiązań nie działało, dodając powyższą linię do mojego pliku ochronnego.Może warto wspomnieć, że jeśli Twoja aplikacja działa w wersji do debugowania, a nie w wydaniu z wyszczególnieniem inflacji z recyklingu, to powyższe rozwiązanie będzie z pewnością właściwym rozwiązaniem, ponieważ program proguard jest używany w wersjach wydania, a nie w debugowaniu. Dziękuję Ci –