使用 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
中显示什么,以及如何显示?你只想要名字吗?还是名称和十六进制值?两者都是String
s?一个TextView
,还是两个?或者也许将名称的文本颜色设置为十六进制值?这就是我所说的“没有通用解决方案”的意思。我们不知道您希望列表是什么样子。
嗨,谢谢。我实际上是带着你的解释到达那里,但仍然需要最后一步。仅在列表视图的一个 textView 中显示名称。
【参考方案1】:
在这里:
public void onResponse(JSONArray response)
您应该检查 JSONArray 并提取每个字符串并放入 ArrayList<String>
。
ArrayList<String> stringsFromJson = new ArrayList<>();
然后,也在同一个地方,为适配器设置值:
myAdapter.clear();
myAdapter.addAll(stringsFromJson);
myAdapter.notifyDataSetChanged();
另外,你的适配器应该定义为ArrayAdapter<String>
。
编辑 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以上是关于使用 ArrayAdapter 将 volley 响应传递给 listview的主要内容,如果未能解决你的问题,请参考以下文章
将 Android volley 导入 Android Studio
ListView 与 ArrayAdapter 和 ViewHolder 将图标添加到错误的项目
Android:将数据添加到 ArrayAdapter 时可见的 ListView 图像闪烁