Android - ClassCastException - на LayoutParams от LinearLayout до AbsListView

У меня есть адаптер списка, который я пытаюсь установить для xml (custom.xml) если я не использую инфляцию (прямая идентификация текста через контекст приложения), она отлично работает.. но тогда мой список не может быть тематическим.

public View getView(int position, View convertView, ViewGroup parent) {
        //System.gc();
        TextView tv;

        LayoutInflater inflater = getLayoutInflater();

        View row = View.inflate(mContext,R.layout.item,null); //.inflate(R.layout.item, parent, false); doesnt work either..
        String id = null;
        if (convertView == null) {
            tv =  (TextView) row.findViewById(R.id.TextView01);;
        } else
            tv = (TextView) convertView;

[..]

in logcat Я получаю это.

    07-15 19:45:51.710: ERROR/AndroidRuntime(20185): FATAL EXCEPTION: main
        java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
        at android.widget.ListView.setupChild(ListView.java:1827)
        at android.widget.ListView.makeAndAddView(ListView.java:1794)
        at android.widget.ListView.fillDown(ListView.java:688)

Мой файл item.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_height="wrap_content"
          android:gravity="left|center"
          android:layout_width="fill_parent"
          android:paddingBottom="15px"
          android:background="#fff200"
          android:paddingTop="15px"
          android:paddingLeft="15px">

<TextView android:id="@+id/TextView01"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:textSize="40px"
          android:textStyle="bold"
          android:layout_marginLeft="20px"
          android:textColor="#0099CC">
</TextView>
</LinearLayout>

Ответы

Ответ 1

Проблема вызвана переносом элемента управления, который вы возвращаете из адаптера, в linearlayout. Потеряйте LinearLayout из вашего файла макета (просто поместите TextView в качестве корня), и я думаю, что он должен работать.

Чтобы увеличить масштаб: вы создаете свой контроль, а затем добавляете его в LinearLayout. На данный момент для него выделяется объект LinearLayout $LayoutParams и задается как его параметры макета. Затем вытащите его из линейного макета и поместите его в свой список, который не понимает LinearLayout $LayoutParams.

Альтернативно, возвращайте строку из getView, а не (как я полагаю, вы делаете в данный момент, так как вы вырезали линию возврата из вашего котируемого кода), возвращая tv.

(Другой, несвязанный намек: вы раздуваете свой макет, а затем отбрасываете его, когда convertView!= null, что приведет к плохой производительности прокрутки на медленных устройствах. Используйте только инфляцию, если вам это действительно понадобится.)

Ответ 2

вы, вероятно, возвращаете tv вместо строки

public View getView(int position, View convertView, ViewGroup parent) {
    TextView tv;

    LayoutInflater inflater = getLayoutInflater();
    View row = View.inflate(mContext,R.layout.item,null);
    String id = null;
    if (convertView == null) {
        tv =  (TextView) row.findViewById(R.id.TextView01);;
    } else
        tv = (TextView) convertView;
    }
 return row;  // returning tv brings to ClassCast!

Ответ 3

Вы пытались использовать разводку макета для раздувания статического xml-макета? Вот так:

LayoutInflater li = LayoutInflater.from(context);
View rootView = li.inflate(R.layout.item, null);

Ответ 4

Правильный способ работы с ArrayAdapter getView для вашего кода таков:

public View getView(int position, View convertView, ViewGroup parent) {
    //System.gc(); // Should not manually call gc
    View row;
    LayoutInflater inflater = getLayoutInflater();
    if (convertView == null) {
        row = inflater.inflate(R.layout.item, parent, false);
    } else
        row = convertView;

    TextView tv = (TextView) row.findViewById(R.id.TextView01);

Кроме того, если вы не можете вручную собрать мусор в своем коде.

Ответ 5

Это правильно:

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    final ViewHolder holder;

    if(view==null){
        vi = inflater.inflate(R.layout.listview_row_myvideos,null);
        holder = new ViewHolder();
        holder.tv =  (TextView) vi.findViewById(R.id.TextView01);

        vi.setTag(holder);
    }else{
        holder = (ViewHolder)vi.getTag();
    }
    return vi;
}

public class ViewHolder{
    TextView tv;
}

Ответ 6

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

public View getView(final int position, View convertView, ViewGroup parent) {
    convertView = G.layoutInflater.inflate(R.layout.list_lay_cities_markets, null);

    // your work 

    notifyDataSetChanged();
    return convertView;
}