Android ListView中适配器和模板视图的组合

时间:2014-05-01 03:37:01

标签: android listview

我想首先说列表视图工作正常,此代码没有问题。

我想知道的是我如何扩展它。我希望在适配器的所有项目出现之前,在列表视图的顶部有一个标签(一些文本来描述列表视图中的项目代表什么)。但很明显,因为我希望里面的列表视图中,当用户开始滚动列表时,我希望标签不在视野范围内。

我如何实现这一目标?

ListView listView = (ListView) findViewById(R.id.list_task_summary);
TasksSummaryListViewHelper adapter = new TasksSummaryListViewHelper(this, getTasks());
listView.setAdapter(adapter);
listView.setEmptyView(findViewById(R.id.text_empty_list));

我的模板:

<ListView
    android:layout_marginRight="5dp"
    android:layout_marginLeft="5dp"
    android:id="@+id/list_task_summary"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:divider="@android:color/transparent"
    android:dividerHeight="15sp"
    android:listSelector="@drawable/list_task_summary_selector_unselected">
</ListView>

2 个答案:

答案 0 :(得分:1)

在自定义列表Adapter中,当调用getView时,为位置0和您拥有列表项目布局的其他位置创建标题视图

@Override
public View getView(int position, View contentView , ViewGroup parent){
    View row = null;

    if(position == 0) {
            // inflate any custom layout or just a textView
            TextView titleView = new TextView();
             titleView.setText("TITLE");
            row = titleView;
        }
        else {
            row = mContext.getLayoutInflater().inflate(R.layout.list_item, null);
        }
    return row;
 }

并且,您将看到ListView的recyle问题,因为它对其他项使用相同的子视图,

因此,您需要Override getViewTypeCount并将视图类型计数返回为2

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

此外,Override getItemViewType并返回位置0和其他视图相同ID的唯一ID。

@Override
public int getItemViewType(int position){
    // return a unique number
    if(position == 0){
        return 0; 
    }
    else {
        return 1;
    }
}

答案 1 :(得分:1)

你可以按照Libin的建议去做,但是如果它是一个需要与列表的其余部分一起滚动的静态视图,我认为最好使用listView.addHeaderView()。这样您根本不需要对适配器进行任何更改。请注意,任何OnListItemClickListeners中报告的位置都将被标题视图的数量所抵消。