Android 添加动态 ListView 标头

Posted

技术标签:

【中文标题】Android 添加动态 ListView 标头【英文标题】:Android Adding Dynamic ListView Header 【发布时间】:2014-08-29 05:56:50 【问题描述】:

我有一个列表视图,我正在尝试为其设置标题,使其看起来像一个表格标题。这是我的列表视图行的 XML 文件:

PS:我删除了一些代码以缩短问题

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/txtDisplayDate"
    android:layout_
    android:layout_
    android:layout_weight="1" />
<TextView
    android:id="@+id/txtDisplayCat"
    android:layout_
    android:layout_
    android:layout_weight="1" />
</LinearLayout>

还有我的标题列表视图的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/txtDisplayDate"
    android:layout_
    android:layout_
    android:layout_weight="1"
    android:text="Date" />
<TextView
    android:id="@+id/txtDisplayCat"
    android:layout_
    android:layout_
    android:layout_weight="1"
    android:text="Category" />

以及我填充列表视图的类:

private class ListAdapter extends BaseAdapter 
    LayoutInflater inflater;
    ViewHolder viewHolder;

    public ListAdapter(Context context) 
        // TODO Auto-generated constructor stub
        inflater = LayoutInflater.from(context);
        LinearLayout listHeaderView = (LinearLayout)inflater.inflate(
                R.layout.trans_header_layout, null);
        listview.addHeaderView(listHeaderView);
    

    @Override
    public int getCount() 
        // TODO Auto-generated method stub
        return _translist.size();
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent)      
        // TODO Auto-generated method stub
        if (convertView == null) 

            convertView = inflater.inflate(R.layout.trans_listview_row,
                    null);
            viewHolder = new ViewHolder();

            viewHolder.txt_ddate = (TextView) convertView
                    .findViewById(R.id.txtDisplayDate);
            viewHolder.txt_dcat = (TextView) convertView
                    .findViewById(R.id.txtDisplayCat);
         else 
            viewHolder = (ViewHolder) convertView.getTag();
        

        viewHolder.txt_ddate.setText(_translist.get(position).getDate()
                .trim());
        viewHolder.txt_dcat.setText(_translist.get(position)
                .getCategory().trim());
        return convertView;
    

但是,通过使用这些代码,这是我得到的输出:

标题与其下方的列不匹配。我想知道是否有其他方法可以将标题添加到列表视图,使其看起来像表格标题。

提前致谢。

编辑

listview所在的我的transaction_rec.XML:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:orientation="vertical" >

        <TextView
            android:layout_
            android:layout_
            android:text="Date" />

        <TextView
            android:id="@+id/txtDisplayDate"
            android:layout_
            android:layout_ />
    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:orientation="vertical" >

        <TextView
            android:layout_
            android:layout_
            android:text="Category" />

        <TextView
            android:id="@+id/txtDisplayCat"
            android:layout_
            android:layout_ />
    </LinearLayout>  
</LinearLayout>

<ListView
    android:id="@+id/listview"
    android:layout_
    android:layout_ >
</ListView>
</LinearLayout>

还有我的 transactionRec.java:

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.transaction_rec);
    context = this;
    listview = (ListView) findViewById(R.id.listview);

    //Code to get data from database


private class ListAdapter extends BaseAdapter 
    LayoutInflater inflater;
    ViewHolder viewHolder;

    public ListAdapter(Context context) 
        // TODO Auto-generated constructor stub
        inflater = LayoutInflater.from(context);
    

    @Override
    public int getCount() 
        // TODO Auto-generated method stub
        return _translist.size();
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent)      
        // TODO Auto-generated method stub
        if (convertView == null) 

            convertView = inflater.inflate(R.layout.transaction_rec,
                    null);
            viewHolder = new ViewHolder();

            viewHolder.txt_ddate = (TextView) convertView
                    .findViewById(R.id.txtDisplayDate);

            viewHolder.txt_dcat = (TextView) convertView
                    .findViewById(R.id.txtDisplayCat);

         else 
            viewHolder = (ViewHolder) convertView.getTag();
        

        viewHolder.txt_ddate.setText(_translist.get(position).getDate()
                .trim());
        viewHolder.txt_dcat.setText(_translist.get(position)
                .getCategory().trim());

        return convertView;
        
    

我现在得到的输出:

【问题讨论】:

恕我直言,您可以使用宽度工资。这里可能是一个解决方案***.com/a/4517358/619673 但是有没有办法根据下面行的列来设置宽度呢? 所以你应该为标题布局验证 onMeasure 并为行布局使用相同的参数。但是工资更容易(它也将设置标题和项目行中项目的工资宽度。假设:工资为 1,因此标题(我们有 5).20,.20,.20,.20,.20 和对于行布局也是相同的值。) 所以基本上我应该做的是将宽度设置为 0dp 而不是 wrap_content? 是的。检查我给你的链接示例。然而 0dp 并不总是适用于所有手机。我用来设置1dp。以防万一.. 【参考方案1】:

试试这个……

        android:layout_
        android:layout_
        android:layout_weight="1" 

所有文本视图。

【讨论】:

您能否提供更多详细信息,说明您建议此答案的内容和原因?这肯定会帮助作者更好地掌握答案

以上是关于Android 添加动态 ListView 标头的主要内容,如果未能解决你的问题,请参考以下文章

在Android中动态添加子项到ListView

android listview 怎么添加数据

ListView移动和动态添加数据

Android ListView 标头

从android中的其他类动态地将对象添加到listview

请问在android的listView中怎么动态加入radioButton和Button按钮?