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