在Android中以编程方式创建listview项

在Android中以编程方式创建listview项,android,android-listview,Android,Android Listview,我有来自WS的数据,需要在Android ListView上显示。 数据可以是不同的类型,所以我需要为ListView项动态创建一个布局,我该怎么做?我想我必须使用LayoutInflater,但我一直在现有布局中使用它,从未从头开始创建布局。我该怎么做呢?您需要为此创建适配器 只需查看此链接,它将详细介绍如何使用适配器 //编辑 在给定的url中,只需检查以下代码 import android.content.Context; import android.view.LayoutInflat

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

您需要为此创建适配器

只需查看此链接,它将详细介绍如何使用适配器

//编辑

在给定的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;
    }
}
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类MySimpleArrayAdapter扩展了ArrayAdapter{
私人最终语境;
私有最终字符串[]值;
公共MySimpleArrayAdapter(上下文上下文,字符串[]值){
super(上下文、R.layout.rowlayout、值);
this.context=上下文;
这个值=值;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
视图行视图=充气机。充气(R.layout.rowlayout,父级,false);
TextView TextView=(TextView)rowView.findViewById(R.id.label);
ImageView ImageView=(ImageView)rowView.findViewById(R.id.icon);
setText(值[位置]);
//更改Windows和iPhone的图标
字符串s=值[位置];
如果(s.startsWith(“iPhone”)){
imageView.setImageResource(R.drawable.no);
}否则{
setImageResource(R.drawable.ok);
}
返回行视图;
}
}
其中R.layout.rowlayout是每行的布局
您可以在其中定义imageviews、textviews,正如您提到的,您使用的是不同的数据类型,我假设您希望每个数据类型显示不同的布局。不需要动态创建listview项;如果需要,可以从XML中膨胀它们

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

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

接下来,看一看并将其实现到适配器中。请务必阅读评论。例如,使用如下内容覆盖
getItemViewType()

public int getItemViewType(int position) {

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

这种方法允许您的listview回收视图并使用ViewHolder模式(有关更多信息,请再次参阅提供的链接vipin)。

vogella网站提供了大量教程,但找不到从头创建的布局示例,其中添加了视图;我看到的所有示例都使用预先存在的xml布局。我想避免这种情况。那么,为什么不尝试通过新对象创建它们,如ListView list=new ListView(context));不需要,因为我不需要添加新的ListView,但是在每一行的ListView中,我需要添加项目作为TextView或ImageView。我认为必须在getView中使用类似于您的解决方案的东西,但不知道如何做到这一点。