Расширяемый ListView с заголовком разделаAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Расширяемый ListView с заголовком раздела

Сообщение Anonymous »

Я хочу создать расширяемый список с заголовками разделов.
Мне удалось заставить их работать с помощью listView, однако, когда я переключился на использование расширяемого списка, я столкнулся с несколькими проблемами:
Изображение
  • При попытке реализовать По методу Джеффа, кажется, заголовки имеют индикатор и кликабельны. Когда я думаю об этом, это кажется неправильным. заголовки не должны быть расширяемымListView или, по крайней мере, не должны вести себя как таковые.
  • Я также заметил, что у меня больше нет функции для IsEnabled() при реализации пользовательского расширяемогоListAdapter. это может быть причиной того, что мои заголовки включены как расширяемый список. Я подумал, что меня мог бы заменить IsChildSelectable(), но это не то, что мне нужно (а именно включить/отключить список групп).
Я спросил кого-то на IRC-канале, и они сказали мне, что, возможно, я пропустил несколько шагов в части упаковки, но я не могу быть в этом уверен, поэтому на данный момент я выложу код.
(кстати, я использую монодроид Xamarin, но стиль и процесс более или менее такие же, как у Android, поэтому я тоже понимаю код Android, так что вот он)
Класс SeparatedExpandableAdapter
using System;
using System.Collections.Generic;
using Android.Content;
using Android.Views;
using Android.Widget;
using Object = Java.Lang.Object;

namespace AndroidApplication10
{
class SeparatedExpandableListAdapter :BaseExpandableListAdapter
{
public readonly Context context;
public readonly Dictionary sections = new Dictionary();
public readonly ArrayAdapter headers;
public static readonly int TYPE_SECTION_HEADER = 0;

public SeparatedExpandableListAdapter(Context context)
{
this.context = context;
headers = new ArrayAdapter(context, Resource.Layout.list_header, Resource.Id.list_header_title);
}

//register our adapter with a section.
public void AddSection(string section, IExpandableListAdapter adapter)
{
headers.Add(section);
sections.Add(section, adapter);
}

/*
* Algorithm for separatedList
* ::correctly find the selected item among child adapters::
* - subtract from the original position
* - do logic once the position find the header (position == 0)
* - do logic once the position find the adapter (position < size)
*/

public override Object GetGroup(int groupPosition)
{
foreach (var section in sections)
{
var size = section.Value.GroupCount + 1;
if (groupPosition == 0) return section.Key;
if (groupPosition < size) return section.Value.GetGroup(groupPosition - 1);

groupPosition -= size;
}
return null;
}
public override Object GetChild(int groupPosition, int childPosition)
{
foreach (var section in sections)
{
var size = section.Value.GroupCount + 1;
if (groupPosition == 0) return null;
if (groupPosition < size) return section.Value.GetChild(groupPosition - 1, childPosition);

groupPosition -= size;
}
return null;
}

public override int GroupCount
{
get
{
var total = 0;
foreach (var adapter in sections.Values)
{
total += adapter.GroupCount + 1;
}
return total;
}
}
public override int GetChildrenCount(int groupPosition)
{
foreach (var section in sections)
{
var size = section.Value.GroupCount + 1;
if (groupPosition == 0) return 0;
if (groupPosition < size) return section.Value.GetChildrenCount(groupPosition - 1);

groupPosition -= size;
}
return 0;
}
public override bool IsEmpty
{
get { return true; }
}

public override int GroupTypeCount
{
get
{
var total = 1;
foreach (var adapter in sections.Values)
{
Console.WriteLine("[ROXEZ]: GroupTypeCount? " + ((BaseExpandableListAdapter)adapter).GroupTypeCount);
total += ((BaseExpandableListAdapter) adapter).GroupTypeCount; //?
Console.WriteLine("[ROXEZ]: total? " + total);
}
return total;
}
}
public override int ChildTypeCount
{
get
{
return base.ChildTypeCount;
}
}

public override int GetGroupType(int groupPosition)
{
var type = 1;
foreach (var section in sections)
{
var size = section.Value.GroupCount + 1;
if (groupPosition == 0) return TYPE_SECTION_HEADER;
if (groupPosition < size)
return ((BaseExpandableListAdapter) (section.Value)).GetGroupType(groupPosition);
groupPosition -= size;
type += ((BaseExpandableListAdapter) (section.Value)).GroupTypeCount;
}
return -1;
}
public override int GetChildType(int groupPosition, int childPosition)
{
return base.GetChildType(groupPosition, childPosition);
}

public override bool AreAllItemsEnabled()
{
return false;
}
public override bool IsChildSelectable(int groupPosition, int childPosition)
{
Console.WriteLine("Position: " + groupPosition + " | Output: " + (GetGroupType(groupPosition) != TYPE_SECTION_HEADER));
return (GetGroupType (groupPosition) != TYPE_SECTION_HEADER);
}

public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
{

var sectionNum = 0;
foreach (var section in sections)
{
var size = section.Value.GroupCount + 1;
if (groupPosition == 0)
{
return headers.GetView(groupPosition, convertView, parent);
}
if (groupPosition < size) return section.Value.GetGroupView(groupPosition - 1, isExpanded, convertView, parent);

groupPosition -= size;
sectionNum++;
}
return null;
}
public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
{
var sectionNum = 0;
foreach (var section in sections)
{
var size = section.Value.GroupCount + 1;
if (groupPosition == 0) return null;
if (groupPosition < size) return section.Value.GetChildView(groupPosition - 1, childPosition, isLastChild, convertView, parent);

groupPosition -= size;
sectionNum++;
}
return null;
}

public override long GetGroupId(int groupPosition)
{
return groupPosition;
}
public override long GetChildId(int groupPosition, int childPosition)
{
return childPosition;
}

public override bool HasStableIds
{
get { return true; }
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/167 ... ion-header
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»