【发布时间】:2016-04-28 14:40:30
【问题描述】:
我是 Android 的绝对初学者。我正在学习如何使用 volley 并将来自 volley request 响应的数据绑定到 listview。当我发出 get 请求并检索响应并将其转换为模型对象时。一切正常。但是当我将它绑定到 Listview 时。它正在抛出错误。我的代码有什么问题?这是正确的做法吗?
我的活动课
public class VolleyActivity extends Activity{
private int lastSawFirstListItem;
private int itemLoadedOn;
private ArrayAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.volley_main);
Button getBtn = (Button)findViewById(R.id.btn_get_request);
getBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
ListView listView = (ListView)findViewById(R.id.volleyListView);
adapter = new CustomAdapter(this,new Entity[0]);
listView.setAdapter(adapter);
String url = "http://api.androidhive.info/feed/feed.json";
JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
List<Entity> items = new ArrayList<Entity>();
try{
JSONArray jsonArray = jsonObject.getJSONArray("feed");
for(int i=0;i<jsonArray.length();i++)
{
JSONObject item = jsonArray.getJSONObject(i);
Entity en = new Entity();
en.setId(item.getInt("id"));
en.setName(item.getString("name"));
en.setUrl(item.getString("url"));
items.add(en);
}
adapter.addAll(items);
adapter.notifyDataSetChanged();
Toast.makeText(getBaseContext(),"Success",Toast.LENGTH_SHORT).show();
}
catch (JSONException e)
{
Toast.makeText(getBaseContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
Volley.newRequestQueue(getBaseContext()).add(jsonRequest);
}
}
这是我的自定义适配器
public class CustomAdapter extends ArrayAdapter<Entity> {
private final Context context;
private final Entity[] values;
public CustomAdapter(Context context,Entity[] values)
{
super(context,-1,values);
this.context = context;
this.values = values;
}
@Override
public View getView(int position,View convertView,ViewGroup parent)
{
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.list_row,parent,false);
TextView id_text = (TextView)rowView.findViewById(R.id.row_id);
TextView name_text = (TextView)rowView.findViewById(R.id.row_name);
TextView url_text = (TextView)rowView.findViewById(R.id.row_url);
id_text.setText(values[position].getId());
name_text.setText(values[position].getName());
url_text.setText(values[position].getUrl());
return rowView;
}
}
这是我运行活动时的 logcat
01-22 04:45:56.298 1492-1492/? W/EGL_genymotion: eglSurfaceAttrib not implemented
01-22 04:45:56.354 477-492/? I/ActivityManager: Displayed com.example.newfeeds.newfeeds/.VolleyActivity: +110ms
01-22 04:45:57.070 1492-1492/? D/AndroidRuntime: Shutting down VM
01-22 04:45:57.070 1492-1492/? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa6219908)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: FATAL EXCEPTION: main
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: java.lang.UnsupportedOperationException
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at java.util.AbstractList.add(AbstractList.java:404)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at java.util.AbstractList.add(AbstractList.java:425)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at java.util.AbstractCollection.addAll(AbstractCollection.java:76)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at android.widget.ArrayAdapter.addAll(ArrayAdapter.java:195)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at com.example.newfeeds.newfeeds.VolleyActivity$2.onResponse(VolleyActivity.java:66)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at com.example.newfeeds.newfeeds.VolleyActivity$2.onResponse(VolleyActivity.java:51)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:725)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:92)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5041)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-22 04:45:57.074 1492-1492/? E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
01-22 04:45:57.074 477-698/? W/ActivityManager: Force finishing activity com.example.newfeeds.newfeeds/.VolleyActivity
01-22 04:45:57.150 477-698/? D/dalvikvm: GC_FOR_ALLOC freed 129K, 29% free 9794K/13620K, paused 10ms, total 10ms
01-22 04:45:57.654 477-490/? W/ActivityManager: Activity pause timeout for ActivityRecord{533353cc u0 com.example.newfeeds.newfeeds/.VolleyActivity}
01-22 04:46:07.154 477-490/? W/ActivityManager: Launch timeout has expired, giving up wake lock!
01-22 04:46:07.654 477-490/? W/ActivityManager: Activity idle timeout for ActivityRecord{53441ff4 u0 com.example.newfeeds.newfeeds/.MainActivity}
01-22 04:46:20.714 56-56/? D/Genyd: Received Set Clipboard
01-22 04:46:20.714 56-56/? D/Genymotion: Received Set Clipboard
01-22 04:47:00.034 477-480/? D/dalvikvm: GC_CONCURRENT freed 1670K, 28% free 9848K/13620K, paused 1ms+2ms, total 25ms
01-22 04:47:15.470 56-56/? D/Genyd: Received Set Clipboard
01-22 04:47:15.470 56-56/? D/Genymotion: Received Set Clipboard
这是将 volley 与 Listview 结合使用并绑定数据的正确方法吗?我该如何解决这个错误?
然后我在自定义适配器中从 Entity[] 更改为 ArrayList<Entity>。它仍然抛出错误。
我的新自定义适配器类与 ArrayList
public class CustomAdapter extends ArrayAdapter<Entity> {
private final Context context;
private final ArrayList<Entity> values;
public CustomAdapter(Context context,ArrayList<Entity> values)
{
super(context,-1,values);
this.context = context;
this.values = values;
}
@Override
public View getView(int position,View convertView,ViewGroup parent)
{
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.list_row,parent,false);
TextView id_text = (TextView)rowView.findViewById(R.id.row_id);
TextView name_text = (TextView)rowView.findViewById(R.id.row_name);
TextView url_text = (TextView)rowView.findViewById(R.id.row_url);
id_text.setText(values.get(position).getId());
name_text.setText(values.get(position).getName());
url_text.setText(values.get(position).getUrl());
return rowView;
}
}
这是我改成ArrayList后的logcat
01-22 05:09:54.770 1895-1895/? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa6219908)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: FATAL EXCEPTION: main
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: android.content.res.Resources$NotFoundException: String resource ID #0x1
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.content.res.Resources.getText(Resources.java:230)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.TextView.setText(TextView.java:3769)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at com.example.newfeeds.newfeeds.CustomAdapter.getView(CustomAdapter.java:36)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.AbsListView.obtainView(AbsListView.java:2159)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.ListView.makeAndAddView(ListView.java:1831)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.ListView.fillDown(ListView.java:674)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.ListView.fillFromTop(ListView.java:735)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.ListView.layoutChildren(ListView.java:1638)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.AbsListView.onLayout(AbsListView.java:1994)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.View.layout(View.java:14008)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4373)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.View.layout(View.java:14008)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4373)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.View.layout(View.java:14008)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4373)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.View.layout(View.java:14008)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4373)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.View.layout(View.java:14008)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4373)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:562)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.Choreographer.doFrame(Choreographer.java:532)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:725)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:92)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5041)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-22 05:09:54.774 1895-1895/? E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
01-22 05:09:54.778 477-489/? W/ActivityManager: Force finishing activity com.example.newfeeds.newfeeds/.VolleyActivity
01-22 05:09:54.894 477-489/? D/dalvikvm: GC_FOR_ALLOC freed 179K, 33% free 9817K/14460K, paused 15ms, total 15ms
01-22 05:09:55.398 477-490/? W/ActivityManager: Activity pause timeout for ActivityRecord{5334f1a0 u0 com.example.newfeeds.newfeeds/.VolleyActivity}
【问题讨论】:
-
你也可以发布你的 CustomAdapter 类吗?
-
是的,我刚刚编辑了问题。
-
但是当我删除这两行时 //adapter.addAll(items); //adapter.notifyDataSetChanged(); ,这是烤成功的消息。
-
查看我的回答,希望对您有所帮助。
-
也发布你的实体类。
标签: android listview android-volley