Java 带有分隔符的自定义ListView变得疯狂

Java 带有分隔符的自定义ListView变得疯狂,java,android,android-listview,android-view,Java,Android,Android Listview,Android View,我正在尝试实现一个自定义ListView,其中包含分隔符。代码如下: 单名: public class SingleTitle { String mTitle; int[] mInterval; public SingleTitle(String title, int[] interval) { mTitle = title; mInterval = interval; } public String getTitle(

我正在尝试实现一个自定义ListView,其中包含分隔符。代码如下:

单名:

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;
    }
}
标题类别:

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;
}
公共静态列表getStructuredTitles(上下文){
列表=新的ArrayList();
字符串[]mTitles=getCategoriesTitles(上下文);
字符串[]mpart=getPartsTitles(上下文);
增加(新的标题类别(MPart[0]);
添加(新的单标题(多标题[0],类别[0]);
增加(新的标题类别(MPart[1]);
添加(新的单一标题(多标题[1],类别[1]);
添加(新的单一标题(多标题[2],类别[2]);
添加(新的单一标题(多标题[3],类别[3]);
添加(新的单一标题(mTitles[4],类别[4]);
增加(新的标题类别(MPart[2]);
增加(新的单一标题(多标题[5],类别[5]);
添加(新的单一标题(mTitles[6],类别[6]);
添加(新的单一标题(mTitles[7],类别[7]);
添加(新的单一标题(mTitles[8],类别[8]);
添加(新的单一标题(mTitles[9],类别[9]);
添加(新的单一标题(mTitles[10],类别[10]);
增加(新的标题类别(MPart[3]);
增加(新的单一标题(多标题[11],类别[11]);
退货清单;
}
我的自定义适配器:

  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();
}

}
公共类titleAdapter扩展了BaseAdapter{
私人语境;
私人名单条目;
公共标题适配器(上下文、列表项){
this.context=上下文;
this.entries=条目;
}
@凌驾
public int getCount(){
返回条目。size();
}
@凌驾
公共对象getItem(int位置){
返回条目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
Object entry=entries.get(位置);
布尔isCategory=(标题类别的输入实例);
if(convertView==null){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(分类?R.layout.list\u类别\u分隔符:R.layout.list\u项目\u简单,空);
}
如果(分类){
标题类别tc=(标题类别)条目;
convertView.setClickable(错误);
Log.d(“DBG”,“条目:”+position+“|”+tc.getTitle());
TextView tv=(TextView)convertView.findViewById(android.R.id.simple\u list\u item\u 2);
如果(tv!=null)tv.setText(tc.getTitle());
}否则{
SingleTitle tc=(SingleTitle)条目;
Log.d(“DBG”,“条目:”+position+“|”+tc.getTitle());
TextView tv=(TextView)convertView.findViewById(android.R.id.text1);
如果(电视!=null)
tv.setText(tc.getTitle());
}
返回视图;
}
公共列表getList(){
返回条目;
}
公共无效集合列表(列出新条目){
条目=新条目;
notifyDataSetChanged();
}
}
我的问题: 该应用程序最初很好地绘制了列表,但当我上下滚动列表时,它会弄乱条目。然而,logcat中生成的输出是正确的,但是Android将列表弄乱了。有什么想法吗

更新: 尝试实施。在您的情况下,它应该返回2

@Override
public int getViewTypeCount() {
    return 2;
}
如果没有实现该方法,Android可能会对单个视图类型进行一些假设

还重写
getItemViewType(int位置)
,使其根据列表中的索引是“类别”还是“标题”返回
0
1

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

同时尝试添加公共int-getItemViewType(int-position)。很高兴它能工作。youtube上有一个关于by和Adam Powell的精彩介绍。