2

У меня есть RecyclerView с LinearLayout внутри. LinearLayout состоит из 9 кнопок. Перед некоторыми изменениями я мог нажать кнопки, и он не разбился. Но после того, как я добавил этот код ниже он дает ошибку и не показывает, откуда приходит:

java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v7.widget.RecyclerView$LayoutParams

импорта в адаптер:

import android.content.Context; 
import android.graphics.Color; 
import android.support.v7.widget.RecyclerView; 
import android.widget.LinearLayout.LayoutParams; 
import android.util.TypedValue; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

Добавлено это в onClickListener:

tempTag = (int) v.getTag(); 
mAdapter.grayButton(tempTag/9, tempTag % 9); 
zahl1 = Integer.parseInt(mAdapter.getText(tempTag).toString()); 

Добавлен этот метод в RecyclerView.Adapter:

public void grayButton(int row, int element){ 
    recycleViewDatas.get(row).setGray(element); 
    notifyItemChanged(row); 
} 

Добавлен этот код в onBindViewHolder:

LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
viewHolder.ll.setLayoutParams(lp); 
lp.height = viewHolder.ll.getLayoutParams().height - (int) (viewHolder.buttons.get(j).getLayoutParams().height - recycleViewDatas.get(i).getSize()) + 30; 
viewHolder.ll.setLayoutParams(lp); 
if(recycleViewDatas.get(i).getGray() == j) 
    viewHolder.buttons.get(j).setTextColor(Color.GRAY); 
else if(recycleViewDatas.get(i).getGray() == -1) 
    viewHolder.buttons.get(j).setTextColor(Color.BLACK); 

Это мой ViewHolder:

public static class ViewHolder extends RecyclerView.ViewHolder { 
    LinearLayout ll; 
    private ArrayList<Button> buttons = new ArrayList<>(); 

    public ViewHolder(View v, Context context) { 
     super(v); 

     ll = (LinearLayout) v.findViewById(R.id.llRecycleView); 
     for (int i = 0; i < ll.getChildCount(); i++) { 
      buttons.add((Button) ll.getChildAt(i)); 
     } 
    } 
} 

Файл Компоновка recycleviewdata:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:weightSum="9" 
android:background="@drawable/zeile" 
android:id="@+id/llRecycleView"> 

<Button 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:textColor="@android:color/black" 
    android:background="@android:color/transparent" 
    android:textSize="23sp" 
    android:clickable="false" 
    android:layout_gravity="center" 
    android:gravity="center" /> 

... больше кнопок

Раскладка MainActivity:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:weightSum="2" 
    android:background="@drawable/top"> 
...some buttons 
</LinearLayout> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/my_recycler_view" 
    android:scrollbars="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/></LinearLayout> 

Я не понимаю, почему ошибка возникает после обновления. И приложение только падает на моем M9. На HTC One V он не падает, и все работает так, как ожидалось. Вы знаете проблему? Вам нужен еще один код?

+0

Проблема указана в названии ... Вы используете 2 разных LayoutParams, один стандарт и один из библиотеки поддержки v7 ... Попробуйте использовать 1 вместо этого ... выберите один в зависимости от дальнейшей потребности – Danielson

+0

Но где я могу использовать 2 разных? В основном и в адаптере я импортирую 'import android.support.v7.widget.RecyclerView; import android.view.ViewGroup.LayoutParams; ' – L3n95

+0

LinearLayout в ViewHolder, что вы импортируете? – Danielson

ответ

1

Ваша проблема заключается в onBindViewHolder:

LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 

LayoutParams реализуется для (почти) всех макетов. Когда вы установите LayoutParams на вид, вам нужно установить его с типом родителей вида. Поэтому, если у вас есть LinearLayout, и вы пытаетесь добавить кнопку, вам необходимо установить LinearLayout.LayoutParams на Button. Проблема в этом случае заключается в том, что вы не знаете родительский тип. И я имею в виду, что он может отличаться на разных версиях Android.

Безопасная ставка заключается в использовании LayoutParams из общего класса (ViewGroup?), Поскольку вы устанавливаете только ширину и высоту.

+1

Вы хотите использовать: ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) ;? Дает мне ошибку: android.view.ViewGroup $ LayoutParams нельзя отбрасывать в android.support.v7.widget.RecyclerView $ LayoutParams – L3n95

+0

Что произойдет, если вы закроете литье? –

Смежные вопросы