【问题标题】:Attaching a JSON array to list view将 JSON 数组附加到列表视图
【发布时间】:2017-08-23 17:25:24
【问题描述】:

我是 Java 新手,所以请原谅任何愚蠢或明显的错误。我有一个从 PHP 文件中提取 json 编码字符串并将其放入简单列表视图的活动。我得到了可怕的红色波浪线,对我来说是一个神秘的错误信息。这是我的代码。感谢您的帮助。

package --Hidden--;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

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

import java.util.HashMap;
import java.util.Map;


public class tracklist extends Activity implements OnItemClickListener {
    private static final String URL = "http://rickthompson.com/json/fetchtracks.php";

    ListView lv;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tracklist);

        lv = (ListView) findViewById(R.id.displayTrackList);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
            R.layout.rowlayout, R.id.label, profileUserOptions);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(this);

        Bundle bundle = getIntent().getExtras();
        final String selectedSubGenre = bundle.getString("option");


        /////////////  login script
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        StringRequest request = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    if (jsonObject.names().get(0).equals("tracks")) {
                        Toast.makeText(getApplicationContext(), "tracks " +    jsonObject.getString("tracks"), Toast.LENGTH_LONG).show();

                        ///  save user id in prefs
                        JSONArray contacts =   jsonObject.getJSONArray("tracks");
                        HashMap<String, String> trackview = null;
                        for (int i = 0; i < contacts.length(); i++) {
                            JSONObject c = contacts.getJSONObject(i);
                            String isrc = c.getString("isrc");

                            trackview = new HashMap<>();
                            trackview.put("isrc", isrc);
                        }

                        trackview.toString();

                        lv = (ListView)  findViewById(R.id.displayTrackList);
                        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.rowlayout, R.id.label, trackview);
                        lv.setAdapter(adapter);
                        lv.setOnItemClickListener(this);
                    } else {
                        Toast.makeText(getApplicationContext(), "Error" + jsonObject.getString("error"), Toast.LENGTH_LONG).show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> hashMap = new HashMap<>();
                SharedPreferences userPrefs = getSharedPreferences("userInfo", Context.MODE_PRIVATE);
                String userid = userPrefs.getString("memberid", "");

                hashMap.put("u", userid);
                Bundle bundle = getIntent().getExtras();
                final String selectedSubGenre = bundle.getString("option");
                hashMap.put("sg", selectedSubGenre);
                return hashMap;
            }
       };

       requestQueue.add(request);
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(getApplicationContext(), "something clicked", Toast.LENGTH_LONG).show();
    }
}

【问题讨论】:

  • 可以添加错误日志吗?
  • 您的代码有问题。您正在为 json 对象的每个 requestQueue 调用创建列表视图。删除 lv = (ListView) findViewById(R.id.displayTrackList); ArrayAdapter&lt;String&gt; adapter = new ArrayAdapter&lt;&gt;(this, R.layout.rowlayout, R.id.label, trackview); 。从 requestQueue 并在类级别声明 Listview 和适配器。还有lv.setAdapter(adapter)在requestQueue中调用notifyDataSetChanged()方法。
  • 感谢您的帮助。我很感激。

标签: java android json listview import


【解决方案1】:
JSONObject jsonObject = new JSONObject(response);
 if(jsonObject.names().get(0).equals("tracks")){
//rest of the code
}

在上面的代码中,我希望您尝试获取“名称”数组,它应该是

    JSONArray jso3 = new JSONArray (jsonObject.getString("names"));

请提供错误详情,以便我给您详细描述。

【讨论】:

    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2016-08-14
    • 2018-05-29
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多