Заставить пользовательский адаптер показывать классифицированные элементы внутри списка

Я хочу выполнить следующее:

Я хочу классифицировать элементы внутри списка, но мои списки, как правило, отображаются только в одной строке, потому что я даю ему только один (пользовательский xml, расширенный пользовательский baseadapter)

Я проверил эту ссылку, но, похоже, она не выполняет то, что я хочу сделать, какие-либо подсказки?

1 ответ

Вы можете добавить изначально скрытый (View.GONE) в заголовок XML вашей строки, заполните его и покажите при обнаружении изменения категории.
Другим более эффективным вариантом будет надувать / создавать и добавлять этот заголовок (который может быть любым View или же ViewGroup) программно при обнаружении изменения категории.
Например (первый вариант):

row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rowContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/txtGroupHeader"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:padding="4dp"
        android:background="@drawable/group_header_gradient"
        android:gravity="center"
        android:textColor="@android:color/white" />

    <ImageView
        android:id="@+id/imgLogo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="1dp"
        android:layout_marginLeft="3dp"
        android:layout_marginRight="5dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/txtGroupHeader" />

</RelativeLayout>

Код адаптера

@Override
public View getView(int position, View convertView, ViewGroup parent){
    View res = null;
    Pojo ev = (Pojo)this.getItem(position);
    Integer prevItemType = null;
    //Get the type of the previous pojo in the list
    if(position > 0){
        Pojo prevEv = (Pojo)this.getItem(position - 1);
        if(prevEv != null){
            prevItemType = prevEv.getType();
        }
    }
    //Determine if this view should have a header
    boolean addHeaderView = !(prevItemType != null && prevItemType.equals(ev.getType()));

    if(convertView != null){
        res = convertView;
    }else{
        res = mInflater.inflate(R.layout.row, null);
    }
    TextView txtHeader = (TextView)res.findViewById(R.id.txtGroupHeader);
    if(addHeaderView){
        String typeName = Database.getTypeDescription(ev.getType());
        if(typeName != null){
            txtHeader.setText(typeName.toUpperCase(Locale.US));
        }
        txtHeader.setVisibility(View.VISIBLE);
    }else{
        txtHeader.setVisibility(View.GONE);
    }

    //Regular row
    ImageView imgLogo = (ImageView)res.findViewById(R.id.imgLogo);
    // ... imgLogo.setImageBitmap ...
    // ... etc ...

    return res;
}

Надеюсь, поможет.

Другие вопросы по тегам