Android ListView标头

Android ListView标头

我有ListView,它有一些事件。事件按日排序,我希望每天都有标题日期,然后在下面收听事件。

以下是我填充该列表的方式:

ArrayList<TwoText> crs = new ArrayList<TwoText>();crs.add(new TwoText("This will be header", event.getDate()));for (Event event : events) {
    crs.add(new TwoText(event.getStartString() + "-" + event.getEndString(), event.getSubject()));}arrayAdapter = new TwoTextArrayAdapter(this, R.layout.my_list_item, crs);lv1.setAdapter(arrayAdapter);

这就是我的类TwoText看起来的样子:

public class TwoText {
    public String classID;
    public String state;

    public TwoText(String classID, String state) {
        this.classID = classID;
        this.state = state;
    }}

这就是我的TwoTextArrayAdapter类的外观:

import java.util.ArrayList;import android.app.Activity;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.TextView;public class TwoTextArrayAdapter extends ArrayAdapter<TwoText> {

    private ArrayList<TwoText> classes;
    private Activity con;
    TextView seperator;

    public TwoTextArrayAdapter(Activity context, int textViewResourceId, ArrayList<TwoText> classes) {
        super(context, textViewResourceId, classes);
        this.con = context;
        this.classes = classes;

    }

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;

        if (v == null) {

            LayoutInflater vi = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            v = vi.inflate(R.layout.my_list_item, null);

        }

我现在所做的是我正在添加标题,就像常规列表对象一样,但我喜欢它作为标题,在我的情况下有一个日期。

我尝试在必要时隐藏它并在必要时显示它但我只是弄乱了我的其余代码。我尝试了更多的教程,但他们也有同样的效果。

任何人都可以指导我如何做到这一点吗?


呼唤远方
浏览 430回答 3
3回答

慕后森

作为替代方案,有一个很好的第三方库专为此用例而设计。因此,您需要根据存储在适配器中的数据生成标头。它们被称为Rolodex适配器并与之一起使用ExpandableListViews。它们可以很容易地进行自定义,就像带有标题的普通列表一样。使用OP的Event对象并知道标题是基于Date与之关联的...代码看起来像这样:活动&nbsp;&nbsp;&nbsp;&nbsp;//There's&nbsp;no&nbsp;need&nbsp;to&nbsp;pre-compute&nbsp;what&nbsp;the&nbsp;headers&nbsp;are.&nbsp;Just&nbsp;pass&nbsp;in&nbsp;your&nbsp;List&nbsp;of&nbsp;objects.&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;EventDateAdapter&nbsp;adapter&nbsp;=&nbsp;new&nbsp;EventDateAdapter(this,&nbsp;mEvents); &nbsp;&nbsp;&nbsp;&nbsp;mExpandableListView.setAdapter(adapter);适配器private&nbsp;class&nbsp;EventDateAdapter&nbsp;extends&nbsp;NFRolodexArrayAdapter<Date,&nbsp;Event>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;EventDateAdapter(Context&nbsp;activity,&nbsp;Collection<Event>&nbsp;items)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(activity,&nbsp;items); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Date&nbsp;createGroupFor(Event&nbsp;childItem)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;is&nbsp;how&nbsp;the&nbsp;adapter&nbsp;determines&nbsp;what&nbsp;the&nbsp;headers&nbsp;are&nbsp;and&nbsp;what&nbsp;child&nbsp;items&nbsp;belong&nbsp;to&nbsp;it &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(Date)&nbsp;childItem.getDate().clone(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;View&nbsp;getChildView(LayoutInflater&nbsp;inflater,&nbsp;int&nbsp;groupPosition,&nbsp;int&nbsp;childPosition, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;isLastChild,&nbsp;View&nbsp;convertView,&nbsp;ViewGroup&nbsp;parent)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Inflate&nbsp;your&nbsp;view &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Gets&nbsp;the&nbsp;Event&nbsp;data&nbsp;for&nbsp;this&nbsp;view &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Event&nbsp;event&nbsp;=&nbsp;getChild(groupPosition,&nbsp;childPosition); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Fill&nbsp;view&nbsp;with&nbsp;event&nbsp;data &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;View&nbsp;getGroupView(LayoutInflater&nbsp;inflater,&nbsp;int&nbsp;groupPosition,&nbsp;boolean&nbsp;isExpanded, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;convertView,&nbsp;ViewGroup&nbsp;parent)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Inflate&nbsp;your&nbsp;header&nbsp;view &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Gets&nbsp;the&nbsp;Date&nbsp;for&nbsp;this&nbsp;view &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;=&nbsp;getGroup(groupPosition); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Fill&nbsp;view&nbsp;with&nbsp;date&nbsp;data &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;hasAutoExpandingGroups()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;forces&nbsp;our&nbsp;group&nbsp;views&nbsp;(headers)&nbsp;to&nbsp;always&nbsp;render&nbsp;expanded. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Even&nbsp;attempting&nbsp;to&nbsp;programmatically&nbsp;collapse&nbsp;a&nbsp;group&nbsp;will&nbsp;not&nbsp;work. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;isGroupSelectable(int&nbsp;groupPosition)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//This&nbsp;prevents&nbsp;a&nbsp;user&nbsp;from&nbsp;seeing&nbsp;any&nbsp;touch&nbsp;feedback&nbsp;when&nbsp;a&nbsp;group&nbsp;(header)&nbsp;is&nbsp;clicked. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java