Сбой заголовка слияния адаптера

У меня проблемы с адаптером слияния CWAC: https://github.com/commonsguy/cwac-merge

Это отлично работает, когда я добавляю представления и адаптеры один за другим, но кажется, что когда я пытаюсь добавить два заголовка один за другим, происходит сбой. Вот что я делаю:

Это макет для первого заголовка:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:weightSum="7"
    android:baselineAligned="false" >

    <LinearLayout
        android:id="@+id/unsynced_layoutt"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="6"
        android:orientation="vertical" >

        <View
            android:layout_width="match_parent"
            android:layout_height="3dp"
            android:background="@color/greenish" />

        <TextView
            android:id="@+id/unsynced_txt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:gravity="center"
            android:text="@string/unsynced_txt" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@string/lorem_ipsum" />

        <View
            android:layout_width="match_parent"
            android:layout_height="3dp"
            android:layout_gravity="bottom"
            android:background="@color/greenish" />
    </LinearLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_weight="1"
        android:id="@+id/sync_close_notification"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:background="@color/grey_bcknd">

        <ImageButton
            android:id="@+id/menu_btn"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="15dp"
            android:background="@null"
            android:contentDescription="@string/something"
            android:src="@drawable/notification_close_x_green" />
    </LinearLayout>

</LinearLayout>

Макет для второго заголовка:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/grey_bcknd"
    android:orientation="vertical" >

    <View
        android:id="@+id/top_line"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:alpha="0.25"
        android:background="@color/grey_line" />

    <TextView
        android:id="@+id/receipt_header_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/top_line"
        android:layout_marginLeft="10dp"
        android:text="@string/active_folders"
        android:textColor="#B4AA9E" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_alignParentBottom="true"
        android:layout_below="@+id/receipt_header_txt"
        android:alpha="0.25"
        android:background="@color/grey_line" />

</RelativeLayout>

и вот где я пытаюсь физически добавить его:

all_adapter = new MergeAdapter();
        final View notification = inflater
                .inflate(R.layout.unsynced_layout, null);
        TextView notification_txt = (TextView) notification.findViewById(R.id.unsynced_txt);
        notification_txt.setText("You have "+unsynced_nr+" unsynced items");
        all_adapter.addView(notification_txt);

        for(int i=0;i<dates.size();i++){
            System.out.println("HERE "+i);
            View header1 = inflater
                    .inflate(R.layout.receipt_list_header, null);
            TextView date_header_txt = (TextView) header1.findViewById(R.id.receipt_header_txt);
            date_header_txt.setText(dates.get(i));
            all_adapter.addView(header1);
            ReceiptDataSource recs1 = new ReceiptDataSource(globalView.getContext());
            recs1.open();
            ArrayList<Receipt> currentReceipts = recs.findReceiptsByDate(dates.get(i), folder_id);
            recs1.close();

            //ReceiptAdapter folder_receipts = new ReceiptAdapter(getActivity(), R.layout.receipt_item, R.layout.receipt_incomplete_item, currentReceipts);
            ReceiptCustomAdapter folder_receipts = new ReceiptCustomAdapter(globalView.getContext(), R.layout.receipt_pager,
                    currentReceipts, getActivity().getSupportFragmentManager());
            all_adapter.addAdapter(folder_receipts);
        }

и трассировка стека:

08-06 11:54:15.558: E/AndroidRuntime(20408): FATAL EXCEPTION: main
08-06 11:54:15.558: E/AndroidRuntime(20408): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
08-06 11:54:15.558: E/AndroidRuntime(20408):    at android.widget.ListView.measureScrapChild(ListView.java:1170)
08-06 11:54:15.558: E/AndroidRuntime(20408):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1252)

Если я прокомментирую строку:

all_adapter.addView(notification_txt);

код больше не вылетает.

Любые предложения высоко ценятся, спасибо.


person Adrian Olar    schedule 06.08.2013    source источник
comment
Как выглядит ваш метод getView() в ListAdapter?   -  person Simon Dorociak    schedule 06.08.2013
comment
я не думаю, что это актуально, код падает при добавлении представления, а не адаптера...   -  person Adrian Olar    schedule 06.08.2013
comment
я думаю, что это актуально, если в ваших методах getView() вы возвращаете, например, только TextView вместо всей строки View.   -  person Simon Dorociak    schedule 06.08.2013
comment
Я возвращаю целую строку View, спасибо за ваше наблюдение, я даже не подумал об этом :)   -  person Adrian Olar    schedule 06.08.2013


Ответы (1)


Вы получаете эту проблему, потому что MergeAdapter ожидает AbsListView.LayoutParams. Попробуй это:

final View notification = inflater.inflate(R.layout.unsynced_layout, null);
TextView notification_txt = (TextView) notification.findViewById(R.id.unsynced_txt);
notification_txt.setText("You have "+unsynced_nr+" unsynced items");
AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
notification_txt.setLayoutParams(layoutParams);
all_adapter.addView(notification_txt);

Но если вы пытаетесь просто добавить весь вид в свой mergeadapter, то вместо all_adapter.addView(notification_txt); вы можете сказать: all_adapter.addView(notification);

person gunar    schedule 06.08.2013
comment
Вы знакомы с CWAC Merge Adapter? Я вставил ссылку на источник GitHub, но это поможет, если вы ранее работали с этим... - person Adrian Olar; 06.08.2013
comment
Я использовал его в проекте и остался доволен. У меня был случай, когда мне нужно было просматривать список и некоторые другие представления, чтобы их можно было прокручивать по вертикали, и для этого отлично подходил mergeadapter. - person gunar; 06.08.2013
comment
Ну, то же самое и для меня, у меня есть список с заголовками, поэтому формат такой: заголовок, затем адаптер, заголовок, затем адаптер, функциональность, которую я достиг с помощью цикла for. это работает просто отлично. дело в том, что мне нужно добавить дополнительный заголовок к этому вверху. Может ли быть проблемой, что это другой макет? Вот в чем я не уверен, если вам нужно сохранить формат: заголовок + адаптер... - person Adrian Olar; 06.08.2013
comment
Вам не нужно сохранять этот формат — адаптер слияния очень гибок, когда дело доходит до того, что можно использовать. У меня получилось то же самое: заголовок + заголовок + список + заголовок + список. Это должно быть прямолинейно, если только вы не делаете ничего экстравагантного :). - person gunar; 06.08.2013
comment
Здесь следует отметить одну вещь: почему вы раздуваете представления только для того, чтобы извлечь из них TextView, вместо того, чтобы создавать экземпляры TextViews на лету? - person gunar; 06.08.2013
comment
в том-то и дело, что заголовки имеют совершенно разные макеты... и мне нужно только обновить содержимое текстового представления... - person Adrian Olar; 06.08.2013
comment
давайте продолжим это обсуждение в чате - person gunar; 06.08.2013
comment
@AdrianOlar: Ключ в последнем предложении Гунара. Вы раздуваете макет, вырываете какой-то виджет из этого макета, а затем пытаетесь добавить его в качестве заголовка. Я ожидал другой ошибки (представление уже имеет родителя), но это определенно не сработает. - person CommonsWare; 06.08.2013
comment
@Mark: Мы обсуждали это, у AdrianOlar была опечатка в коде, он хотел добавить все представление, а не TextView. Между прочим, отличная библиотека! Спасибо! :) - person gunar; 06.08.2013