Заголовки разделов в представлении списка ящиков навигации

Я хочу реализовать заголовки разделов, аналогичные тем, которые используются в Pirate Bay введите здесь описание изображения

В основном Listview, как это:

заголовок Список имен Список элементов Список элементов Список элементов Список элементов Заголовок элемента Список имен Список элементов Список элементов Элемент

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


person James Wahome    schedule 11.06.2013    source источник


Ответы (2)


Вот как я это решил:

Я научил свой пользовательский ListAdapter возвращать строки заголовков, а также строки сведений, это включает в себя переопределение методов getViewTypeCount() и getItemViewType() в вашем ListAdapter, плюс я получил getView(), чтобы узнать разницу между типами строк. Следующий код должен дать вам подсказку. Код для ListViewAdapter (прокомментировано большинство частей)

public class ListViewAdapter extends ArrayAdapter<ListViewItemModel> {

public ListViewAdapter(Context context) {
    super(context, 0);
}

public void addHeader(int title) { //expects The Title for the header as an Arugment to it
    add(new ListViewItemModel(title, -1, true));//add the object to the Bottom of the array
}

public void addItem(int title, int icon) {
    add(new ListViewItemModel(title, icon, false));
}

public void addItem(ListViewItemModel itemModel) {
    add(itemModel);
}

@Override
public int getViewTypeCount() {  //Returns the number of types of Views that will be created by getView(int, View, ViewGroup).
    return 2; //we will create 2 types of views
}

@Override
public int getItemViewType(int position) { //framework calls getItemViewType for row n, the row it is about to display.
    //Get the type of View that will be created by getView(int, View, ViewGroup) for the specified item.
    return getItem(position).isHeader ? 0 : 1; // get position passes (n) and accertain  is its a header  or not
}

@Override
public boolean isEnabled(int position) {
    return !getItem(position).isHeader;
}

public static class ViewHolder {
    public final TextView textHolder;
    public final ImageView imageHolder;

    public ViewHolder(TextView text1, ImageView image1) {
        this.textHolder = text1;
        this.imageHolder = image1;
    }
}

public View getView(int position, View convertView, ViewGroup parent) {
  //Abstract View --> Get a View that displays the data at the specified position in the data set.
    ListViewItemModel item = getItem(position);
    ViewHolder holder = null;
    View view = convertView;

    if (view == null) {
        int layout = R.layout.list_view_row;
        if (item.isHeader)
            layout = R.layout.list_view_row_header;

        view = LayoutInflater.from(getContext()).inflate(layout, null);

        TextView text1 = (TextView) view.findViewById(R.id.menurow_title);
        ImageView image1 = (ImageView) view.findViewById(R.id.menurow_icon);
        view.setTag(new ViewHolder(text1, image1));
    }

    if (holder == null && view != null) {
        Object tag = view.getTag();
        if (tag instanceof ViewHolder) {
            holder = (ViewHolder) tag;
        }
    }

    if (item != null && holder != null) {
        if (holder.textHolder != null)
            holder.textHolder.setText(item.title);

        if (holder.imageHolder != null) {
            if (item.iconRes > 0) {

                holder.imageHolder.setVisibility(View.VISIBLE);
                holder.imageHolder.setImageResource(item.iconRes);
            } else {
                holder.imageHolder.setVisibility(View.GONE);
            }
        }
    }

    return view;
}

}

И модель для использования ArrayAdapter

 public class ListViewItemModel {

public int title;
public int iconRes;
public boolean isHeader;

public ListViewItemModel(int title, int iconRes, boolean header) {
    this.title = title;
    this.iconRes = iconRes;
    this.isHeader = header;
}

public ListViewItemModel(int title, int iconRes) {
    this(title, iconRes, false);
}

}

Теперь в классе я буду использовать этот пользовательский список в навигации

ListViewAdapter mAdapter = new ListViewAdapter(this);// Add First Header        
mAdapter.addHeader(R.string.menu_data);
menu_One = getResources().getStringArray(R.array.menu_one); // Load list view data     array strings
    String[] menuOneIcons =   getResources().getStringArray(R.array.menu_two_one);// Load list view image array strings


    int oneIcons = 0;
    for (String item : menuItemsData) { //enhanced For loop, iterate on elements from the collection named menuItemsData

        int id_menu_one = getResources().getIdentifier(item, "string",this.getPackageName());

        int id_menu_one_icons = getResources().getIdentifier(menuOneIcons[oneIcons], "drawable",this.getPackageName());



        ListViewItemModel mItem = new ListViewItemModel(id_data_title,id_data_icon);

        mAdapter.addItem(mItem);
        oneIcons++;
    }
    // Add second header

    mAdapter.addHeader(R.string.menu_two); //second Header here

    menu_Two = getResources().getStringArray(R.array.menu_two);
    String[] menuTwoIcons = getResources().getStringArray(R.array._menu_two_icons);


    int twoIcons = 0;
    for (String item : menu_Two) {

        int id_menu_two = getResources().getIdentifier(item, "string",this.getPackageName());

        int id_menu_two_icons = getResources().getIdentifier(enuTwoIcons[twoIcons], "drawable",this.getPackageName());


        // creating drawer menu model
        ListViewItemModel mItem = new ListViewItemModel(id_menu_two,id_menu_two_icons);

        mAdapter.addItem(mItem);
        twoIcons++;
    }
person James Wahome    schedule 13.06.2013

Просто используйте ExpandableListView с одной группой на заголовок.

person Stephane Mathis    schedule 11.06.2013
comment
это не будет работать, поскольку расширяемый список должен быть явно расширен для отображения содержимого (я исправлен), где, как и в моем случае, мне нужно, чтобы в списке были только заголовки разделов - person James Wahome; 11.06.2013
comment
используйте любую реализацию списка с заголовками stackoverflow.com/questions/1966802/android-listview-headers - person Georgy Gobozov; 11.06.2013
comment
Когда вы уведомляете свой адаптер, вам просто нужно вызвать expandGroup(int index) в вашем списке. Вы также можете заставить каждое представление оставаться открытым, даже если пользователь нажимает на группу. Я использовал это решение для одного из своих приложений. - person Stephane Mathis; 11.06.2013