在Android中以编程方式创建列表视图项

时间:2012-04-02 12:21:06

标签: android android-listview

我有来自WS的数据需要在Android ListView上显示。 数据可以是不同类型的,所以我需要动态创建ListView项目的布局,我该怎么做呢?我想我必须使用LayoutInflater,但总是将它与现有布局一起使用,并且从不从头开始创建布局。我该怎么办?

2 个答案:

答案 0 :(得分:2)

你需要为那个

创建适配器

只需查看此链接即可详细说明使用适配器。

http://www.vogella.de/articles/AndroidListView/article.html

//编辑

在给定的URL中

只需检查此代码

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MySimpleArrayAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final String[] values;

    public MySimpleArrayAdapter(Context context, String[] values) {
        super(context, R.layout.rowlayout, values);
        this.context = context;
        this.values = values;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.rowlayout, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
        textView.setText(values[position]);
        // Change the icon for Windows and iPhone
        String s = values[position];
        if (s.startsWith("iPhone")) {
            imageView.setImageResource(R.drawable.no);
        } else {
            imageView.setImageResource(R.drawable.ok);
        }

        return rowView;
    }
}

其中R.layout.rowlayout是每行的布局 您可以在其中定义图像视图,textviews

答案 1 :(得分:1)

正如您提到的那样,您使用的是不同的数据类型,我假设您希望为每种数据类型显示不同的布局。没有必要动态创建listview-items;如果你愿意,你可以用XML来夸大它们。

创建自定义listadapter(请参阅vipin提供的vogella链接)并覆盖getView()getItemViewType()getViewTypeCount()方法。

getView()中,您可以通过编程方式构建视图,也可以从XML中扩展视图。要确定要膨胀(或构建)的布局,请调用getItemViewType(position),检查它返回的值,然后选择要为该值膨胀的布局。有关如何构建XML布局的更多信息,请参阅this page in the dev guide on XML layouts

接下来,查看this answer并将其实现到适配器中。一定要阅读评论。例如,使用以下内容覆盖getItemViewType()

public int getItemViewType(int position) {

    if(getItem(position) instanceOf ItemA) {
        return 0;
    } else {
        return 1;
    }
}

此方法允许列表视图回收视图并使用ViewHolder模式(有关详细信息,请再次参阅提供的链接vipin)。