Android - ListView显示项目的不同布局

时间:2014-03-18 13:42:50

标签: android listview

我有ListView,显示数据库中的项目列表。所以我使用SimpleCursorAdapter

if (mDiscussionsCursor != null && mDiscussionsCursor.getCount() > 0) {
    mAdapter = new SimpleCursorAdapter(mContext, R.layout.home_discussion_row, mDiscussionsCursor, FROM, TO, 0);
    mAdapter.setViewBinder(VIEW_BINDER);
    setAdapter(mAdapter);
    setOnItemClickListener(this);
}

这些物品按时间顺序排列。我想在每天之间设置一条分隔线,即显示2013年5月1日的所有商品,然后是2013年5月2日的标题,然后是当天的所有商品等。

我假设我可以带我的Cursor并将其复制到Array,其中包含代表日期标题的特殊单元格,然后使用此处显示的方法:http://android.amberfog.com/?p=296

然而,这在空间和时间上对我来说都是非常浪费的练习,我想知道你可能会想到更聪明的东西。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以尝试对SimpleCursorAdapter进行子类化,并从教程中重写其关联成员

getItemViewType
getViewTypeCount
getView

如果你看一下SimpleCusrsorAdapter和ListAdapter(ListView适配器)的继承层次结构,你会发现它们都是BaseAdapter的子类,因此这是可能的原因。

http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html    http://developer.android.com/reference/android/widget/ListAdapter.html    http://developer.android.com/reference/android/widget/BaseAdapter.html

修改

它可能不像简单的子类化和覆盖一样切割和干燥。您可能还需要将CursorAdapter父类中的一些代码合并到您的替代中,并且

bypass calling super.method().

例如,这里是CursorAdapter.java的getView覆盖,你可能需要

explicitly call bindView()

(参考:http://androidxref.com/4.0.3_r1/xref/frameworks/base/core/java/android/widget/CursorAdapter.java

public View getView(int position, View convertView, ViewGroup parent) {
    if (!mDataValid) {
        throw new IllegalStateException("this should only be called when the cursor is valid");
    }
    if (!mCursor.moveToPosition(position)) {
        throw new IllegalStateException("couldn't move cursor to position " + position);
    }
    View v;
    if (convertView == null) {
        v = newView(mContext, mCursor, parent);
    } else {
    v = convertView;
    }
    bindView(v, mContext, mCursor);
    return v;
}

要使用外部参照源代码存储库,请转到

http://androidxref.com/

选择您的api版本,然后在

“完整搜索”

<强> ObjectName.java

并在右侧列表中

“在项目中”

向下滚动并选择

<强> “框架”

它搜索(我觉得这是获得你想要的最直接有效的方法)。