使用 ArrayAdapter 将 volley 响应传递给 listview

Posted

技术标签:

【中文标题】使用 ArrayAdapter 将 volley 响应传递给 listview【英文标题】:Passing volley response to listview using an ArrayAdapter 【发布时间】:2017-09-27 05:10:08 【问题描述】:

我无法弄清楚如何使用适配器(myadapter)将凌空响应传递给列表视图。我是否使用 myadapter.add() 并传递它什么?我阅读了教程,经过数周的尝试,我认为是时候寻求帮助了。因此,如果您有时间,如果您能帮助我,我将不胜感激。谢谢。我能够在文本视图中显示响应。

  package hfad.com.adapters;


    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.TextView;

    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.JsonArrayRequest;
    import com.android.volley.toolbox.Volley;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    public class MainActivity extends Activity 

        //thorntech.com parsing jsonandroid using colley library
        TextView results;
        // URL of object to be parsed
        String JsonURL = "https://raw.githubusercontent.com/ianbar20/JSON-Volley-Tutorial/master/Example-JSON-Files/Example-Array.JSON";
        // This string will hold the results
        String data = "";
        // Defining the Volley request queue that handles the URL request concurrently

        ListView myList;

        RequestQueue requestQueue;

        //Adding adapter and assign it -set- to a listview



        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // Creates the Volley request queue
            requestQueue = Volley.newRequestQueue(this);

            // Casts results into the TextView found within the main layout XML with id jsonData
            results = (TextView) findViewById(R.id.textView);
            myList = (ListView) findViewById(R.id.listv);
            final ArrayAdapter<String> myAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
            ListView myList = (ListView) findViewById(R.id.listv);
            myList.setAdapter(myAdapter);

            // Creating the JsonArrayRequest class called arrayreq, passing the required parameters
            //JsonURL is the URL to be fetched from
            JsonArrayRequest arrayreq = new JsonArrayRequest(JsonURL,
                    // The second parameter Listener overrides the method onResponse() and passes
                    //JSONArray as a parameter
                    new Response.Listener<JSONArray>() 

                        // Takes the response from the JSON request
                        @Override
                        public void onResponse(JSONArray response) 


                     //Juan suggestion:
                     ArrayList<String> myArraylist
                    myArraylist = new ArrayList<String>();

            

我的 mainactivity.xml:包括一个 textview 和 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="vertical"
    android:padding="10dp"
    tools:context=".MainActivity"
    android:weightSum="1">


    <TextView
        android:id="@+id/textView"
        android:layout_
        android:layout_
        android:text="TextView" />

   <ListView
       android:id="@+id/listv"
       android:layout_
       android:layout_/>


</LinearLayout>

我的问题是如何使用 arrayadapter 将响应从 volley 传递到 listview?

【问题讨论】:

您究竟想在ListView 中显示什么?没有通用的解决方案可以将任意 JSON 放入 ListView。该 URL 中的 JSON 最终是两个具有不同数据的不同数组 - 一个数组是具有名称和十六进制值的颜色,另一个是仅具有名称的形状。你想怎么处理? 我只是想学习如何显示任何数组,所以我将使用哪个数组没有区别。让我们选择“带有名称和十六进制值的颜色”。该怎么做? 对于特定的 JSON,您已经将它作为 JSONArray 获取,因此您将获取第一个对象 - JSONObject jo = response.getJSONObject(0) - 然后获取它的数组 - JSONArray colorArray = jo.getJSONArray("colorArray") - 然后循环得到你想要的。但是,你又想在ListView 中显示什么,以及如何显示?你只想要名字吗?还是名称和十六进制值?两者都是Strings?一个TextView,还是两个?或者也许将名称的文本颜色设置为十六进制值?这就是我所说的“没有通用解决方案”的意思。我们不知道您希望列表是什么样子。 嗨,谢谢。我实际上是带着你的解释到达那里,但仍然需要最后一步。仅在列表视图的一个 textView 中显示名称。 【参考方案1】:

在这里:

 public void onResponse(JSONArray response) 

 

您应该检查 JSONArray 并提取每个字符串并放入 ArrayList&lt;String&gt;

ArrayList<String> stringsFromJson = new ArrayList<>();

然后,也在同一个地方,为适配器设置值:

myAdapter.clear();
myAdapter.addAll(stringsFromJson); 
myAdapter.notifyDataSetChanged();

另外,你的适配器应该定义为ArrayAdapter&lt;String&gt;

编辑 1

您需要考虑的一些事项:

    您必须在清单中添加 INTERNET 权限 在您粘贴的代码中,您实际上并未将请求发送到服务器。为此,您需要将您的请求添加到请求队列中。 您获取的 JSON 不仅仅是一个字符串列表,因此根据您想要显示的内容,您可能需要更改列表视图的布局、适配器和/或您在适配器后面填充数组列表的方式。

为了提供一个示例,我选择使用形状名称填充列表视图的简单替代方法。您可以尝试并更改其他替代方案。

清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.apackagename.so_43691098">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">

        <activity android:name="SO_43691098">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

主要活动

package com.apackagename.so_43691098;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;


public class SO_43691098 extends AppCompatActivity 

        private static final String TAG = SO_43691098.class.getSimpleName();

        //thorntech.com parsing jsonandroid using colley library
        TextView results;
        // URL of object to be parsed
        String JsonURL = "https://raw.githubusercontent.com/ianbar20/JSON-Volley-Tutorial/master/Example-JSON-Files/Example-Array.JSON";
        // This string will hold the results
        String data = "";
        // Defining the Volley request queue that handles the URL request concurrently

        ListView myList;

        RequestQueue requestQueue;

        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_activity);
            // Creates the Volley request queue
            requestQueue = Volley.newRequestQueue(this);

            // Casts results into the TextView found within the main layout XML with id jsonData
            results = (TextView) findViewById(R.id.textView);
            myList = (ListView) findViewById(R.id.listv);
            final ArrayAdapter<String> myAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
            ListView myList = (ListView) findViewById(R.id.listv);
            myList.setAdapter(myAdapter);

            // Creating the JsonArrayRequest class called arrayreq, passing the required parameters
            //JsonURL is the URL to be fetched from
            JsonArrayRequest arrayRequest = new JsonArrayRequest(JsonURL,
                    new Response.Listener<JSONArray>()

                        @Override
                        public void onResponse(JSONArray response) 
                            //Juan suggestion:
                            ArrayList<String> myArrayList = new ArrayList<>();

                            try 
                                JSONArray shapes = response.getJSONObject(1).getJSONArray("shapeArray");
                                for(int i=0; i<shapes.length(); i++) 
                                    myArrayList.add(shapes.getJSONObject(i).getString("shapeName"));
                                
                             catch (JSONException e)
                                    Log.e(TAG, "Getting shape name", e);
                            

                            myAdapter.clear();
                            myAdapter.addAll(myArrayList);
                            myAdapter.notifyDataSetChanged();
                        
                    ,
                    new Response.ErrorListener()

                        @Override
                        public void onErrorResponse(VolleyError error) 
                            Log.e(TAG, error.getMessage(), error);
                        
                    
            );

            requestQueue.add(arrayRequest);

        

我没有对布局进行任何更改。

【讨论】:

感谢您花时间向我展示。我会去玩弄代码。如果我需要帮助,我会回来的。欣赏它。 胡安,我需要更多帮助。我更改了我的 ArrayAdapter,然后添加了 ArrayList myArraylist 但无法弄清楚如何将响应传递给它。你能帮忙提供一个代码示例吗? 我用一个例子编辑了我的答案。在结果变量中获取 JSON 后,您可以提取所需的信息并将其作为字符串包含在 arraylist 中以在列表视图中显示。 娟,晴天。这就是我一直在寻找的东西,我现在明白了。我会在 api 对象的另一半上练习,我相信我会完成它。 Android 的文档应该重写,因为它根本不清楚。就像 Angular 文档一样,谷歌工程师看起来很聪明,但不是优秀的作家或无法编写文档。我感谢您的帮助。谢谢 嗨,胡安,再次感谢您的帮助。我能够解析来自不同 api 的许多不同的截击响应。现在我有一个关于您的代码的问题(与解析响应无关),但它是“private static final String TAG = MainActivity.class.getSimpleName();”这一行。 getSimpleName() 是干什么用的?当然我的好奇心开始了,我用谷歌搜索并在这里找到了大讨论(***.com/questions/15202997/…)在你回答我的问题时使用它的目的是什么?

以上是关于使用 ArrayAdapter 将 volley 响应传递给 listview的主要内容,如果未能解决你的问题,请参考以下文章

Android之ArrayAdapter使用

将 Android volley 导入 Android Studio

ListView 与 ArrayAdapter 和 ViewHolder 将图标添加到错误的项目

Android:将数据添加到 ArrayAdapter 时可见的 ListView 图像闪烁

现在我想使用 ArrayAdapter 将列表视图的特定数据表单显示到另一个列表视图中

ListView ArrayAdapter,将子项隐藏在 Row 中?