Android - 包含图像和文本的Listview

时间:2014-05-12 21:28:00

标签: android android-layout listview android-arrayadapter

我刚刚开始学习android,我正处于我想要解决下面描述的问题但我不确定如何开始。

我有一个包含以下数据的数据数组

1, text1, image1.png
2, text2, image2.png
3, text3, null
4, null, image3.png

我知道如何在一些教程之后使用ArrayAdapter创建一个ListView以及它们的xml布局。

正如您在上面的数组中看到的,有时它不包含图像,有时它不包含文本,有时它同时包含文本。

我的问题是如何使布局工作,以便它根据数组值动态更改?

换句话说,我怎样才能开始考虑构建listview + ArrayAdapter + layout,我只能在数组记录只有图像的情况下查看图像,在只有文本时查看文本视图,在查看时查看两者两者都可用。

指向教程的链接非常有用

2 个答案:

答案 0 :(得分:1)

您可以创建一个表示一个数组元素的 MyCustomType 类型(在您的情况下,它包含数字,文本和图像)。此外,您需要实现自定义数组适配器。此适配器使用MyCustomType的ArrayList。

public class CustomAdapter extends ArrayAdapter<MyCustomType> {

//... 

private ArrayList<MyCustomType> foo;

public CustomAdapter(Context context, Activity bar, ArrayList<MyCustomType> foo) {
    super(bar, R.layout.row, foo);

    this.foo = foo;
    mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

覆盖 getViewTypeCount()以确定您拥有多少种不同的行。 getItemViewType 返回必须显示的行类型。

你的getView方法可能类似于他的方法:

public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder viewHolder; 
    int type = getItemViewType(position); // decide what row type has to be displayed

    if (convertView == null) {              
        convertView = mInflater.inflate(R.layout.row, parent, false);

        viewHolder = new ViewHolder();
        viewHolder.number = //...
        viewHolder.text = //...
        viewHolder.image = //...

        convertView.setTag(viewHolder);
    }
    else {
        viewHolder = (ViewHolder) convertView.getTag(); // avoided to call findViewById
    }


    switch(type) {
    case TYPE1:
        //... you could just change the visibility of the corresponding view
        break;
    case TYPE 2:
        // ...
        break;
    }

    return convertView;
}

答案 1 :(得分:0)

我的建议是使用自定义数组适配器。有一个很好的教程here

可以找到官方文档here

基本上,您将创建一个扩展ArrayAdapter类的类。实现覆盖并将您的处理显示或不显示在getView方法中的特定视图。此方法将为传递它的列表中的每个项目触发。