【问题标题】:Android - Listview with image and textAndroid - 带有图像和文本的列表视图
【发布时间】:2014-05-22 23:13:52
【问题描述】:

我刚开始学习 android,现在我想做下面描述的问题,但我不知道如何开始。

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

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

我知道如何按照一些教程创建带有 ArrayAdapter 的 ListView 以及它们的 xml 布局。

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

我的问题是如何使它与布局一起工作,以便它根据数组值动态变化?

换句话说,我该如何开始考虑构建一个 listview+ArrayAdapter+layout,在那里我只能在数组记录只有图像的情况下查看 imageiew,在只有文本时查看 textview,在只有文本时查看它们两者都可用。

教程链接将非常有用

【问题讨论】:

  • 我认为您必须将 TextView 和 ImageView 放在 ListView 项目布局中,并尝试隐藏/显示数据内容。

标签: android android-layout listview android-arrayadapter


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

    官方文档可以在here找到。

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

    【讨论】:

    • 谢谢,我知道那部分,我不是如何只在没有文字时显示图像,或仅在没有图像时显示文字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多