以编程方式将TextView添加到Listview自定义行

not*_*eek 0 android textview android-listview android-linearlayout baseadapter

我想以编程方式将一个TextView添加到XML文件中声明的Linearlayout,该文件定义应用于所有listview行的自定义行.为了做到这一点,我有以下代码:

<LinearLayout
    android:id="@+id/zv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/title"
    android:layout_marginBottom="1dip"
    android:layout_marginLeft="5dip"
    android:layout_marginRight="5dip"
    android:orientation="vertical"
    android:padding="1dip" >
</LinearLayout>

class ListViewAdapter extends BaseAdapter {

(...)
public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if (convertView == null)
            vi = inflater.inflate(R.layout.row, null);

        TextView tv_nz = new TextView(activity.getApplicationContext());

        LinearLayout zv = (LinearLayout)vi.findViewById(R.id.zv);

        tv_nz.setText("testing...");
        zv.addView(tv_nz);
(...)

return vi;
}
Run Code Online (Sandbox Code Playgroud)

但是TextView在每一行中出现多次.我究竟做错了什么?谢谢

Sam*_*Sam 5

我真正想要做的是在某些条件下添加Textview和一些ImageViews,否则我不能在XML文件中声明它.

您应该使用多个布局来正确执行此操作,因为在行的布局中添加和删除视图可能既昂贵又缓慢.您可以使用XML或Java创建不同的布局,但是在适配器中,您必须覆盖getViewTypeCount()getItemViewType()告诉Adapter期望多个布局以及要用于每行的布局.

这很简单,我写了一个例子:在Android Listview中使用2种不同的布局重用视图


原版的

但是TextView在每一行中出现多次.我究竟做错了什么?

您没有考虑ListView回收行的方式.这在Google I/O演示文稿(如Turbo-Charge Your UI)中有详细解释.

也许你应该简单地将额外的TextView添加到行的XML布局中或使用多个布局.由于您没有解释为什么要添加TextView,因此很难给出明确的建议.


这只为每行添加一个TextView:

public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        // Code here only affects new rows
        convertView = inflater.inflate(R.layout.row, null);

        TextView tv_nz = new TextView(activity.getApplicationContext());
        tv_nz.setText("testing...");
        convertView.addView(tv_nz);
    }
    else {
        // Code here affects only recycled rows
    }

    // Code here affects every row when the ListView is scrolled
    return convertView;
}
Run Code Online (Sandbox Code Playgroud)