Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-带图像和文本的Listview_Android_Android Layout_Listview_Android Arrayadapter - Fatal编程技术网

Android-带图像和文本的Listview

Android-带图像和文本的Listview,android,android-layout,listview,android-arrayadapter,Android,Android Layout,Listview,Android Arrayadapter,我刚开始学习android,我正处在一个我想回答以下问题的阶段,但我不知道如何开始 我有一个包含以下数据的数据数组 1, text1, image1.png 2, text2, image2.png 3, text3, null 4, null, image3.png 通过一些教程,我知道如何使用ArrayAdapter及其xml布局创建ListView 正如您在上面的数组中所看到的,有时它不包含图像,有时它不包含文本,有时它同时包含两种内容 我的问题是如何使布局工作,以便它根据数组值动态更改

我刚开始学习android,我正处在一个我想回答以下问题的阶段,但我不知道如何开始

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

1, text1, image1.png
2, text2, image2.png
3, text3, null
4, null, image3.png
通过一些教程,我知道如何使用ArrayAdapter及其xml布局创建ListView

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

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

换句话说,我如何开始考虑构建一个listview+ArrayAdapter+布局,在该布局中,我只能在数组记录只有图像的情况下查看ImageView,在只有文本的情况下查看textview,在两者都可用的情况下查看这两个视图


指向教程的链接将非常有用

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

可以找到官方文件

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

您可以创建一个表示一个数组元素的类型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);
}

谢谢,我知道这一部分,我不知道如何只在没有文本的情况下显示图像,或者只在没有图像的情况下显示文本。我认为您必须将TextView和ImageView放在ListView项目布局中,并尝试隐藏/显示数据内容。
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;
}