使用具有字符串数组作为元素的 ArrayList 填充 ListView

Posted

技术标签:

【中文标题】使用具有字符串数组作为元素的 ArrayList 填充 ListView【英文标题】:Populate ListView with ArrayList having String array as elements 【发布时间】:2015-11-11 07:19:40 【问题描述】:
dataAdapter = new ArrayAdapter(getApplicationContext(), R.layout.lst_layout, R.id.lstLayout, exList);
                lstView = (ListView) findViewById(R.id.listView);
                lstView.setAdapter(dataAdapter);

exList 是 String 数组的 ArayList。如何用它填充 ListView?

exList = new ArrayList<String[]>();

编辑从这里开始。它在此处创建的 asynctask 中 asdad asd asd asdasada sdada daasd asd ad asda dasd asd asda da dasdasd asdasd ad :

@Override
        protected String doInBackground(String... urls) 
            String[] temp = new String[4];
            try 
                InputStream stream = downloadUrl("http://www.tcmb.gov.tr/kurlar/today.xml");
                try 
                    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                    factory.setNamespaceAware(true);
                    XmlPullParser xpp = factory.newPullParser();
                    xpp.setInput(new InputStreamReader(stream));

                    int eventType = xpp.getEventType();
                    int kontrol = 0;
                    while (eventType != XmlPullParser.END_DOCUMENT) 

                        if (eventType == XmlPullParser.START_TAG) 


                            if (xpp.getName().equals("Currency")) 
                                kontrol++;
                                //ExchangeRate exr = new ExchangeRate();
                                //exr.setCurrencyCode(xpp.getAttributeValue(null, "CurrencyCode"));
                                temp[0] = xpp.getAttributeValue(null, "CurrencyCode");
                                Log.d("deneme: ", xpp.getAttributeValue(null, "CurrencyCode"));

                             else if (xpp.getName().equals("Isim") && xpp.next() == XmlPullParser.TEXT) 
                                kontrol++;
                                //ExchangeRate exr = exList.get(exList.size() - 1);
                                //exr.setCurrencyName(xpp.getText());
                                temp[1] = xpp.getText();
                                Log.d("deneme", xpp.getText());

                             else if (xpp.getName().equals("ForexBuying") && xpp.next() == XmlPullParser.TEXT) 
                                kontrol++;
                                //ExchangeRate exr = exList.get(exList.size() - 1);
                               //exr.setForexBuying(Double.valueOf(xpp.getText()));
                                temp[2] = xpp.getText();
                                Log.d("deneme", xpp.getText());
                            else if (xpp.getName().equals("ForexSelling") && xpp.next() == XmlPullParser.TEXT) 
                                kontrol++;
                                //ExchangeRate exr = exList.get(exList.size() - 1);
                                //exr.setForexBuying(Double.valueOf(xpp.getText()));
                                temp[3] = xpp.getText();
                                Log.d("deneme", xpp.getText());
                            
                            if (kontrol == 4) 
                                exList.add(temp);
                                temp = new String[4];
                                kontrol=0;
                            
                        
                        eventType = xpp.next();
                    

                 catch (XmlPullParserException e) 
                    e.printStackTrace();
                

                return "";

             catch (IOException e) 
                return e.getMessage();
            
        

【问题讨论】:

你遇到了什么问题? 为您面临的问题提供适当的理由 当我启动应用程序时,我在列表视图中看到 [Ljava.lang.String;@354....不是数组列表中字符串数组的字符串元素。 请出示exList的代码。 请在您创建exList的地方添加更多代码 【参考方案1】:

要使用基本的 ArrayAdapter,您只需要初始化适配器并将适配器附加到 ListView。首先,我们初始化适配器:

ArrayList<String> exList = new ArrayList<>();
exList.add("data1");
exList.add("data2");
ArrayAdapter<String> itemsAdapter = 
new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, exList);

ArrayAdapter 需要声明要转换为视图的项目类型(在本例中为字符串),然后接受三个参数:上下文(活动实例)、XML 项目布局和数据数组。请注意,我们选择了 simple_list_item_1.xml,它是一个简单的 TextView 作为每个项目的布局。

现在,我们只需将此适配器连接到要填充的 ListView:

ListView lstView = (ListView) findViewById(R.id.listView);
lstView.setAdapter(dataAdapter);

希望对你有帮助!

【讨论】:

我想创建 ArrayList。当我按照您建议的方式运行它时,结果是一样的。 为什么必须使用 String[]。您是否必须在适配器中传递多个数据? 如果您已将 String[] 传递给适配器,那么您必须为其制作自定义适配器。在简单的适配器中,您只能传递字符串值【参考方案2】:

要将String[] 的元素转换为ArrayList,请使用Arrays.asList() 方法:

String[] temp = new String[4];
//Assign value for each element in this array in doInBackground...
List<String> stringList = new ArrayList<String>(Arrays.asList(temp));

您看到的[Ljava.lang.String;@xxxx 是您的String[] 的内部形式。致quote:

如果这个类对象代表一个数组类,那么内部 名称的形式由前面的元素类型的名称组成 一个或多个 '[' 字符表示数组的深度 嵌套 [当调用 toString() 时]。元素类型名称的编码如下:

Element Type        Encoding
boolean             Z
byte                B
char                C
double              D
float               F
int                 I
long                J
short               S 
class or interface  Lclassname;

编辑:

String[] temp;
//temp is the String array returned from/populated in your doInBackground method.
List<String> exlist = new ArrayList<>(Arrays.asList(temp));
dataAdapter = new ArrayAdapter(getApplicationContext(), R.layout.lst_layout, R.id.lstLayout, exList);
                lstView = (ListView) findViewById(R.id.listView);
                lstView.setAdapter(dataAdapter);

【讨论】:

如果我应用它,我应该在我共享的代码中究竟在哪里做呢?还必须应用哪些更改? @gokturk 这取决于。本质上,ArrayAdapter 通常将List&lt;String&gt; 作为其参数。您甚至可以尝试直接传递您的 String[],因为有一个 ArrayAdapter 构造函数接受 T[] object 参数:developer.android.com/intl/ru/reference/android/widget/…, int, int, T[]) 。我已经对我的答案添加了一个编辑,但这应该会有所帮助。【参考方案3】:

我按照建议使用自定义适配器处理了它。这是适配器:

package com.xxx.xxx;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class OzelAdapter extends BaseAdapter 

    private LayoutInflater mInflater;
    private ArrayList<String[]> mKisiListesi;

    public OzelAdapter(Activity activity, ArrayList<String[]> kisiler) 
        //XML'i alıp View'a çevirecek inflater'ı örnekleyelim
        mInflater = (LayoutInflater) activity.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        //gösterilecek listeyi de alalım
        mKisiListesi = kisiler;
    

    @Override
    public int getCount() 
        return mKisiListesi.size();
    

    @Override
    public Object getItem(int position) 
        //şöyle de olabilir: public Object getItem(int position)
        return mKisiListesi.get(position);
    

    @Override
    public long getItemId(int position) 
        return position;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        View satirView;

        satirView = mInflater.inflate(R.layout.lst_layout, null);
        TextView textView1 =
                (TextView) satirView.findViewById(R.id.lstLayout1);
        TextView textView2 =
                (TextView) satirView.findViewById(R.id.lstLayout2);
        TextView textView3 =
                (TextView) satirView.findViewById(R.id.lstLayout3);
        TextView textView4 =
                (TextView) satirView.findViewById(R.id.lstLayout4);

        textView1.setText(mKisiListesi.get(position)[0]);
        textView2.setText(mKisiListesi.get(position)[1]);
        textView3.setText(mKisiListesi.get(position)[2]);
        textView4.setText(mKisiListesi.get(position)[3]);

        return satirView;
    

这里是listview的布局行:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="horizontal" >

    <TextView
        android:layout_
        android:layout_
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:gravity="left"
        android:textColor="@color/black"
        android:maxLines="8"
        android:lines="8"
        android:id="@+id/lstLayout1"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:editable="false" />

    <TextView
        android:layout_
        android:layout_
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:gravity="left"
        android:textColor="@color/black"
        android:maxLines="8"
        android:lines="8"
        android:id="@+id/lstLayout2"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:editable="false" />
    <TextView
        android:layout_
        android:layout_
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:gravity="left"
        android:textColor="@color/black"
        android:maxLines="8"
        android:lines="8"
        android:id="@+id/lstLayout3"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:editable="false" />
    <TextView
        android:layout_
        android:layout_
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:gravity="left"
        android:textColor="@color/black"
        android:maxLines="8"
        android:lines="8"
        android:id="@+id/lstLayout4"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:editable="false" />

</LinearLayout>

最后:

OzelAdapter dataAdapter = new OzelAdapter(MainActivity.this, exList);
                lstView = (ListView) findViewById(R.id.listView);
                lstView.setAdapter(dataAdapter);

【讨论】:

以上是关于使用具有字符串数组作为元素的 ArrayList 填充 ListView的主要内容,如果未能解决你的问题,请参考以下文章

将字符串数组转换为 Arraylist 的 ArrayList [重复]

ArrayList源码分析

ArrayList 和LinkedList的区别?

C#数组如何添加元素

Java集合--ArrayList源码

如何从字符串 ArrayList 在字符串数组中的随机位置添加元素。在 Android Java 中