使用BaseAdapter在Listview中添加标题头

3

如何在使用BaseAdapter的ListView中添加标题?除了下面所使用的方法之外,还有没有其他方法。

我尝试过使用addHeaderView(header)函数,但仍然无法成功。

需要一些帮助。谢谢!以下是代码:

public class ViewInterview extends Activity {

InterviewList interviewList = null;
TextView header;
ListView list = null;

static ArrayList<String> titlelist;
static ArrayList<String> markingslist;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_interview);

    list = (ListView) findViewById(R.id.list_interview);
    String TAG = "INTERVIEW LIST";
    header = (TextView) findViewById(R.id.header);
    header.setText("Test");

    titlelist = new ArrayList<String>();
    markingslist = new ArrayList<String>();

    try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        XMLReader xreader = parser.getXMLReader();
        InputSource is = new InputSource(getResources().openRawResource(R.raw.booklist));

        InterviewHandler myInterviewHandler = new InterviewHandler();
        xreader.setContentHandler(myInterviewHandler);
        xreader.parse(new InputSource(is.getByteStream()));
    } catch(Exception e) {
        Log.i(TAG, "InterviewList parse exception " + e.getMessage());
    }

    //---get result from InterviewHandler tempInterviewList
    interviewList = InterviewHandler.tempInterviewList;
    String strMarkings = interviewList.getMarkings().get(0);
    String[] arrMarkings = strMarkings.split("\\|\\|");
    for(int i=0; i<arrMarkings.length; i++) {
        titlelist.add("Title " + interviewList.getTitle().get(0));
        markingslist.add(arrMarkings[i]);
    }
    //list.addHeaderView(header);
    //setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, interviewList.interview));

    list.setAdapter(new InterviewAdapter(this,titlelist,markingslist));

}

public static class InterviewAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private List<String> dataTitle;
    private List<String> dataMarkings;

    public InterviewAdapter(Context context, List<String> dataTitle, List<String> dataMarkings) {
        mInflater = LayoutInflater.from(context);
        dataTitle = this.dataTitle;
        dataMarkings = this.dataMarkings;
    }

    public int getCount() {
        return titlelist.size();
    }

    public Object getItem(int position) {
        return position;
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null) {
            convertView = mInflater.inflate(R.layout.layout_interview, null);
            holder = new ViewHolder();
            holder.title = (TextView)convertView.findViewById(R.id.title);
            holder.markings = (TextView)convertView.findViewById(R.id.markings);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.title.setText(titlelist.get(position));
        holder.markings.setText(markingslist.get(position));
        return convertView;
    }

    static class ViewHolder {
        TextView title;
        TextView markings;
    }
}

}

3个回答

8
你根本不能这么做。
View header = findViewById(R.layout.headerView);
lst.addHeaderView(header);

这样做不会起作用,因为被传递的视图必须被膨胀。简而言之,在您的活动开始时执行setContentView时,Android框架会自动填充视图并将其投入使用。为了填充您的标题视图,您所需做的就是:
View header = (View)getLayoutInflater().inflate(R.layout.headerView,null);
ls.addHeaderView(header);

最后,在设置标题视图并运行应用程序后,添加适配器。您应该看到您的标题视图以及您放入适配器中的内容。
在我的情况下,这个方法是有效的。
View header = getLayoutInflater().inflate(R.layout.header, null); 

ListView listView = getListView();  
listView.addHeaderView(header);  

setListAdapter(new ArrayAdapter<String>(this,             android.R.layout.simple_list_item_single_choice,android.R.id.text1, names)); 

很好,但我正在使用BaseAdapter。而且我不知道在哪里放置那段代码。 - Lawrence Gimenez
适配器是不同的东西,HeaderView 只涉及到 ListView。 - user370305
哦,我明白了。事情已经解决了。我已经编辑好了所有的XML布局。谢谢! - Lawrence Gimenez
是的。根据您的回答和一些博客。 - Lawrence Gimenez

2

我之前遇到了一个类似的问题,这是我想出来的解决方案...

我创建了一个视图,我喜欢称其为SandwichListView,它大致如下:

public class SandwichListView extends ListView {

private View header = null;
private View footer = null;

/* here you have to publicly override the constructors */

@Override
public void addView(View child, android.view.ViewGroup.LayoutParams params) {
    if (header == null) {
        addHeaderView(child);
        header = child;
        return;
    } else if (footer == null) {
        addFooterView(child);
        footer = child;
    } else {
        throw new IllegalStateException(
                "Only a header and a footer allowed in this view, use Layouts");
    }
}

public View getHeader() {
    return header;
}

public View getFooter() {
    return footer;
}

}

在您的 XML 接口模板上,您可以像这样使用它:

<com.oos.kryten.views.SandwichListView
    android:id="@+id/sandwich"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <include
            android:id="@+id/header"
            layout="@layout/details_header" />
    </FrameLayout>
    <View
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/footer" />
</com.oos.kryten.views.SandwichListView>

这样,您可以在 XML 中轻松添加标题和页脚,然后像正常情况下一样使用您的 Adapter :)

附注:我认为您可以直接使用 <include />,但我不是100%确定。


1

尝试这个源代码

View headerView = ((LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.yourLayout, null, false);
list.addHeaderView(headerView );

这个会起作用。但是只有在调用setAdapter之后,标题才会出现。

在调用 setAdapter 方法之前,是否可以让标题先出现? - aandis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接