2016-04-20 1 views
0

Я пытаюсь почти целый день исправить эту ошибку ... но logcat не предоставляет достаточно информации для меня, чтобы понять, что я делаю неправильно. На моем реальном устройстве, работающем с API 23, мой recyclerview работает хорошо. Как только я запустил приложение на эмуляторе, работающем под API 19, мои приложения вылетают, когда он начинает загружать адаптер recycleview. В эмуляторе, работающем с Lollipop, эта проблема не сохраняется. Вот код.App crashes on RecyclerView (Adapter) по API 19

HistoryActivity

RecyclerView recyclerView1; 
RecyclerView.Adapter rvadapter1; 
RecyclerView.LayoutManager rvLayoutManager1; 

public static ArrayList<String> itemAdress; 
public static ArrayList<String> itemAuthor; 
public static ArrayList<String> itemDate; 

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


    Toolbar toolbar = (Toolbar) findViewById(R.id.rv_toolbar); 
    setSupportActionBar(toolbar); 
    toolbar.setTitle(R.string.title_recyclerview); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDisplayShowHomeEnabled(true); 

    itemAdress = new ArrayList<>(); 
    itemAuthor = new ArrayList<>(); 
    itemDate = new ArrayList<>(); 


    recyclerView1 = (RecyclerView) findViewById(R.id.recyclerView1); 
    rvLayoutManager1 = new LinearLayoutManager(this); 
    recyclerView1.setLayoutManager(rvLayoutManager1); 
    recyclerView1.setHasFixedSize(true); 

    rvadapter1 = new RVAdapter(); 
    recyclerView1.setAdapter(rvadapter1); 

} 

RVAdapter

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ViewHolderKlasse> { 

public class ViewHolderKlasse extends RecyclerView.ViewHolder{ 

    TextView itemAdress; 
    TextView itemAuthor; 
    TextView itemDate; 

    public ViewHolderKlasse(View itemView) { 
     super(itemView); 
     itemAdress = (TextView) itemView.findViewById(R.id.itemAdress); 
     itemAuthor = (TextView) itemView.findViewById(R.id.itemAuthor); 
     itemDate = (TextView) itemView.findViewById(R.id.itemDate); 

    } 
} 

@Override 
public ViewHolderKlasse onCreateViewHolder(ViewGroup viewGroup, int i) { 


    View itemView1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item_rv, null); 

    return new ViewHolderKlasse(itemView1); 
} 

@Override 
public void onBindViewHolder(final ViewHolderKlasse viewHolderKlasse, final int i) { 

    viewHolderKlasse.itemAdress.setText(HistoryActivity.itemAdress.get(i)); 
    viewHolderKlasse.itemAuthor.setText(HistoryActivity.itemAuthor.get(i)); 
    viewHolderKlasse.itemDate.setText(HistoryActivity.itemDate.get(i)); 

} 

@Override 
public int getItemCount() { 

    return HistoryActivity.itemAdress.size(); 
} 
} 

И вот что я вижу в LogCat

FATAL EXCEPTION: main 
Process: support.plus.test, PID: 3640 java.lang.VerifyError:  support/plus/test/rv/RVAdapter at  support.plus.test.rv.HistoryActivity.onCreate(HistoryActivity.java:82) 

Линия 82:

 rvadapter1 = new RVAdapter(); 

Любая помощь или идеи приветствуются! Заранее спасибо.

+0

Вы можете разместить свой код адаптера? где вы простираетесь от Recyclerview.Adapter? –

+0

Какую версию библиотеки совместимости вы используете? – MeetTitan

+0

@MeetTitan 'compile' com.android.support:appcompat-v7:23.3.0 '' – Wladislaw

ответ

0

Я нашел проблему, которая меня убивает ...

Когда я добавить только этой линию к приложению build.gradle

multiDexEnabled true 

сбоя приложения на Android API 19 (KitKat).

После того как я добавил дополнительно это в зависимости:

compile 'com.android.support:multidex:1.0.1' 

и это в манифесте

android:name="android.support.multidex.MultiDexApplication" 

и синхронизации проекта с Gradle файлов, мое приложение работает как шарм, и он перестает врезаться.

Спасибо, ребята, в любом случае!

2

Таким образом, VerifyError проверяет на 3 вещи:

  • Ветви указывают на допустимые участки.
  • Данные инициализируются, а ссылки являются безопасными по типу.
  • Контроль доступа к частным лицам или к пакетам частных, данных и методов.

Также в вашем случае вы получаете доступ к Activity изнутри адаптера, который сам по себе уже является ошибкой в ​​дизайне, создает слишком большую зависимость. Создайте конструктор для адаптера с информацией вам необходимо:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ViewHolderKlasse> { 
    ArrayList<String> mItemAdress; 
    ArrayList<String> mItemAuthor; 
    ArrayList<String> mItemDate; 
    public RVAdapter(ArrayList<String> itemAdress, ArrayList<String> itemAuthor, ArrayList<String> itemDate){ 
     mItemAdess = itemAdress; 
     mItemAuthor = itemAuthor; 
     mItemDate = itemDate; 
    } 
    ... 
} 

Используйте эти массивы в адаптере и вместо создания адаптера через пустой конструктор, создать его через эту новую.

+0

по-прежнему такое же поведение, API 19 сбоев, API 22, 23 работает как шарм. Я проанализирую теперь 3 массива из моей HistoryActivity для RVAdapter, и там я изменил использование элементов, и я больше не получаю их отбрасывать HistoryActivity.itemAdress. Может ли быть какая-то зависимость от дизайна или своего рода? ... – Wladislaw