2012-04-15 2 views
0

Я пытаюсь реализовать пользовательский ListView, в котором есть разделители. Это код:Пользовательский ListView с Separator сходит с ума

SingleTitle:

public class SingleTitle { 
    String mTitle; 
    int[] mInterval; 

    public SingleTitle(String title, int[] interval) { 
     mTitle = title; 
     mInterval = interval; 
    } 

    public String getTitle() { 
     return mTitle; 
    } 

    public int[] getInterval() { 
     return mInterval; 
    } 
} 

TitleCategory:

public class TitleCategory { 
String mTitle; 

public TitleCategory(String title) { 
    mTitle = title; 
} 

public String getTitle() { 
    return mTitle; 
} 
} 

list_category_divider.xml:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical"> 

<include 
    android:id="@+id/list_item_section_text" 
    layout="@android:layout/preference_category" /> 

</ LinearLayout > 

Метод, который возвращает список:

public static List<Object> getStructuredTitles(Context context) { 
    List<Object> list = new ArrayList<Object>(); 
    String[] mTitles = getCategoriesTitles(context); 
    String[] mParts = getPartsTitles(context); 

    list.add(new TitleCategory(mParts[0])); 
    list.add(new SingleTitle(mTitles[0], CATEGORIES_INTERVALS[0])); 
    list.add(new TitleCategory(mParts[1])); 
    list.add(new SingleTitle(mTitles[1], CATEGORIES_INTERVALS[1])); 
    list.add(new SingleTitle(mTitles[2], CATEGORIES_INTERVALS[2])); 
    list.add(new SingleTitle(mTitles[3], CATEGORIES_INTERVALS[3])); 
    list.add(new SingleTitle(mTitles[4], CATEGORIES_INTERVALS[4])); 
    list.add(new TitleCategory(mParts[2])); 
    list.add(new SingleTitle(mTitles[5], CATEGORIES_INTERVALS[5])); 
    list.add(new SingleTitle(mTitles[6], CATEGORIES_INTERVALS[6])); 
    list.add(new SingleTitle(mTitles[7], CATEGORIES_INTERVALS[7])); 
    list.add(new SingleTitle(mTitles[8], CATEGORIES_INTERVALS[8])); 
    list.add(new SingleTitle(mTitles[9], CATEGORIES_INTERVALS[9])); 
    list.add(new SingleTitle(mTitles[10], CATEGORIES_INTERVALS[10])); 
    list.add(new TitleCategory(mParts[3])); 
    list.add(new SingleTitle(mTitles[11], CATEGORIES_INTERVALS[11])); 

    return list; 
} 

Мой заказ адаптер:

public class TitlesAdapter extends BaseAdapter { 
private Context context; 
private List<Object> entries; 

public TitlesAdapter(Context context, List<Object> entries) { 
    this.context = context; 
    this.entries = entries; 
} 


@Override 
public int getCount() { 
    return entries.size(); 
} 

@Override 
public Object getItem(int position) { 
    return entries.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Object entry = entries.get(position); 
    boolean isCategory = (entry instanceof TitleCategory); 

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(isCategory ? R.layout.list_category_divider : R.layout.list_items_simple, null); 
    } 

    if (isCategory) { 
     TitleCategory tc = (TitleCategory)entry; 
     convertView.setClickable(false); 

     Log.d("DBG", "Entry: " + position + " | " + tc.getTitle()); 
     TextView tv = (TextView) convertView.findViewById(android.R.id.simple_list_item_2); 
     if (tv != null) tv.setText(tc.getTitle()); 
    } else { 
     SingleTitle tc = (SingleTitle)entry; 

     Log.d("DBG", "Entry: " + position + " | " + tc.getTitle()); 
     TextView tv = (TextView) convertView.findViewById(android.R.id.text1); 
     if (tv != null) 
      tv.setText(tc.getTitle()); 
    } 
    return convertView; 

} 


public List<Object> getList() { 
    return entries; 
} 

public void setList(List<Object> newentries) { 
    entries = newentries; 
    notifyDataSetChanged(); 
} 

} 

Моя проблема: приложение изначально привлекает список хорошо, но когда я прокрутки вверх и вниз по списку он путает записи. Однако вывод, сгенерированный в logcat, прав, но Android испортил список. Есть идеи?

UPDATE: Correct one Wrong one

+0

Вы можете опубликовать снимок экрана? –

+0

Done;) 10chars – Gnufabio

ответ

2

Try реализовать getViewTypeCount(). В вашем случае он должен вернуть 2.

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

Android, вероятно, делает некоторые предположения на одном типе просмотра, если этот метод не реализован.

Кроме того, переопределить getItemViewType(int position), чтобы он возвращал либо 0, либо 1 в зависимости от того, является ли индекс в списке «категория» или «заголовок».

@Override 
public int getItemViewType(int position) { 
    ... 
} 
+0

Спасибо, человек, но он все еще не работает. – Gnufabio

+0

попытайтесь добавить общедоступный int getItemViewType (int position). – alex

+0

Это сработало! Спасибо :) – Gnufabio

Смежные вопросы