【问题标题】:Cannot add new data from JSON to adapter of Listview in Android无法将新数据从 JSON 添加到 Android 中的 Listview 适配器
【发布时间】: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&lt;Entity&gt;。它仍然抛出错误。

我的新自定义适配器类与 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


【解决方案1】:

好的,如果我理解正确,您使用的是Entity[] values,这是一个普通数组,您必须在初始化时定义它的大小。

问题是这个普通数组不能在旅途中扩展或缩小(我的意思是你不能减少或添加更多的项目)。所以它的大小和初始化时一样。

在您的活动中,您提供的是一个ArrayList 对象,它可以在旅途中添加或删除项目。

所以这就是你在这里面临的冲突,

您需要做的是在Customadapter 中有一个ArrayList 实例,类似这样,

    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;
    }

现在您可以像这样分配值 ArrayList 值 = 新 ArrayList(); CustomAdapter 适配器 = new CustomAdapter(this, values);

在调用网络调用后,像这样将项目添加到列表中

values.addAll(items);

并调用此方法notifyDataSetChanged(),因为您有使用观察者模式的优势

adapter.notifyDataSetChanged();

您还可以使用JSON 上的github 查看listview 人口的一些示例,

你必须像 OOP 那样思考,创建一个模型类,其实例将为你保存数据

public class Entity {

    private String id;
    private String name;
    private String url;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
}

更新, 因为有很多困惑,试试这个

public class ListVewTestThreeActivity extends AppCompatActivity {

    private ListView listView;
    private ArrayList<Entity> entities;
    private MyAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_vew_test_three);
        Toolbar toolbar = (Toolbar) findViewById(R.id.my_custom_toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        initializeUI();
    }

    private void initializeUI() {
        listView = (ListView) findViewById(R.id.ListVewTestThreeActivity_listView);
        entities = new ArrayList<>();
        myAdapter = new MyAdapter(getApplicationContext(), R.layout.simple_list_item_1, entities);
        listView.setAdapter(myAdapter);

        new DownloadJSON().execute();
    }

    private class DownloadJSON extends AsyncTask<Void, Void, Void> {

        private ArrayList<Entity> tempEntities;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            tempEntities = new ArrayList<>();
        }

        @Override
        protected Void doInBackground(Void... params) {

            try {

                URL url = new URL("http://api.androidhive.info/feed/feed.json");
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.connect();

                String result = IOUtils.toString(httpURLConnection.getInputStream());
                System.out.println("" + result);

                JSONObject jsonObject = new JSONObject(result);
                JSONArray jsonArray = jsonObject.getJSONArray("feed");

                for (int i = 0; i < jsonArray.length(); i++) {
                    Entity entity = new Entity();
                    entity.setId(jsonArray.getJSONObject(i).getString("id"));
                    entity.setName(jsonArray.getJSONObject(i).getString("name"));
                    entity.setUrl(jsonArray.getJSONObject(i).getString("image"));
                    System.out.println(""+entity.getName());
                    tempEntities.add(entity);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            if (tempEntities != null) {
                entities.addAll(tempEntities);
                System.out.println("Size: "+entities.size());
                myAdapter.notifyDataSetChanged();
            }

        }
    }


    private class MyAdapter extends ArrayAdapter {

        private ArrayList<Entity> a_productInfos;
        private Context a_context;
        private LayoutInflater a_layoutInflater;

        public MyAdapter(Context context, int resource, ArrayList<Entity> a_productInfos) {
            super(context, resource, a_productInfos);
            this.a_productInfos = a_productInfos;
            this.a_context = context;
            a_layoutInflater = LayoutInflater.from(this.a_context);
        }


        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row = convertView;
            ViewHolder holder = null;
            if (row == null) {
                row = a_layoutInflater.inflate(R.layout.single_item_listview_test_three, parent, false);
                holder = new ViewHolder();
                holder.id = (TextView) row.findViewById(R.id.ListVewTestThreeActivity_id_textView);
                holder.name = (TextView) row.findViewById(R.id.ListVewTestThreeActivity_name_textView);
                holder.url = (TextView) row.findViewById(R.id.ListVewTestThreeActivity_url_textView);
                row.setTag(holder);
            } else {
                holder = (ViewHolder) row.getTag();
            }

            final Entity productInfo = a_productInfos.get(position);
            holder.id.setText("" + productInfo.getId());
            holder.name.setText("" + productInfo.getName());
            holder.url.setText("" + productInfo.getUrl());
            return row;
        }

        class ViewHolder {
            TextView id;
            TextView name;
            TextView url;
        }

        @Override
        public int getCount() {
            return super.getCount();
        }
    }

    public class Entity {

        private String id;
        private String name;
        private String url;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }
}

输出

更新

【讨论】:

【解决方案2】:

我认为您在adapterid_text.setText(values[position].getId()); 中遇到以下行中的错误,您必须将其更改为

id_text.setText(String.valueOf(values[position].getId()))

这很简单,因为您必须在 setText 方法中传递 String。目前它正在获取int 值,这就是为什么它会从R 中找到资源。这就是它抛出Resources$NotFoundException 的原因。

希望你清楚。

【讨论】:

  • 我没有看到你的课程有任何变化。你明白我想说什么
  • 我发布了两个版本的适配器类
  • 它不适用于阵列适配器。所以我将自定义适配器的值转换为arraylist,然后我尝试了这样。我在 AarrayAdapter 上试过这样。 String.valueOf(values.get(position).getId()) 。有效。它不适用于阵列适配器。
【解决方案3】:

请用以下代码替换您的代码,如果这有帮助,请告诉我。

VolleyActivity

    public class VolleyActivity extends Activity{
    private int lastSawFirstListItem;
    private int itemLoadedOn;
    private ArrayAdapter adapter;
    private List<Entity> items;
    @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) {

            }
        });
        items = new ArrayList<Entity>();
        ListView listView = (ListView)findViewById(R.id.volleyListView);
        adapter = new CustomAdapter(this, items);
        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 List<Entity> values;

      public CustomAdapter(Context context,List<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(String.valueOf(values.get(position).getId()));
          name_text.setText(values.get(position).getName());
          url_text.setText(values.get(position).getUrl());
          return rowView;
      }
     }

【讨论】:

  • 我试过这样。投掷错误。你刚刚编辑了问题。
  • 您是否在 CustomAdapter 类中将 values[position].getId() 更改为 values.get(position).getId() ? @Waiyan
  • 是的,我绝对做到了
  • 替换 id_text.setText(values.get(position).getId());到 id_text.setText(String.valueOf(values.get(position).getId()));我也编辑了 CustomAdapter 类。请检查。 @Waiyan
  • 是的,我现在刚刚发布了答案
【解决方案4】:

结合Pankaj Nimgade 和Soham 的答案,我得到了答案。首先,我将自定义适配器的值转换为 ArrayList 而不是数组。然后我在适配器中检索像这样的整数 id 的值。

String.valueOf(values.get(position).getId())

它甚至不需要adapter.notifyDataSetChanged()。它工作。谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多