android - Android ListView 中的 JSONArray

标签 android json list listview

urlHi 我有这段代码可以从 php 页面接收数据,我想将该数据放在 ListView 中。我收到了该数据,并且我已经通过 system.out.println 看到了该数据,但 ListView 中有白行。代码:

public class Utenti extends ListActivity {


ListView lv;
    
ListView listView;

static String temp;
    //ListAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    

    
           
        
          
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    
      StrictMode.setThreadPolicy(policy);
      
    


lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        

        }
    });

     
      

      
      Thread t = new Thread(new Runnable (){

          public void run() {
              //Looper.prepare();
              JSONObject json =conn("ketut.php");

              try {
                  //Get the element that holds the earthquakes ( JSONArray )
                  JSONArray  ute = json.getJSONArray("success");
                  final List<HashMap<String, String>> mylist = 
                          new ArrayList<HashMap<String, String>>();
                  HashMap<String, String> map = new HashMap<String, String>();
                     for(int i=0;i < ute.length();i++){

                      JSONObject e = ute.getJSONObject(i);
                       System.out.println(e.getString("user"));

                      
                      
                       map.put("name",  e.getString("user"));
                       
                      
                     
                       mylist.add(map);
                  }

                     runOnUiThread(new Runnable() {


                         public void run() {

                          ListAdapter adapter = new SimpleAdapter(Utenti.this, mylist , R.layout.utentii,new String[] { "name" },new int[] { 1});
                          Utenti.this.setListAdapter(adapter);
                          }

                      });

              } catch (JSONException e) {
                  System.out.println("4");
                  e.printStackTrace();
              }

          }
      });
              t.start();
        //  t.start();  
      

     


        

}


public  static JSONObject conn(String pagina){
    HttpURLConnection connection;
    OutputStreamWriter request = null;
    URL url = null;
    String response = null;
    JSONObject jArray = null;
    

    try
        {
            url = new URL("url"+pagina);
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestMethod("POST");

            
            String line = "";

            InputStreamReader isr = new InputStreamReader(connection.getInputStream());
            BufferedReader reader = new BufferedReader(isr);
            StringBuilder sb = new StringBuilder();
            while ((line = reader.readLine()) != null)
            {
                sb.append(line + "\n");
            }
            response = sb.toString();
            System.out.println(response);
            try{jArray=new JSONObject (response);}
            catch(JSONException e){}
            
            isr.close();
            reader.close(); 
        }
        catch(IOException e)
        {
            Log.i("NetworkTest","Network Error: " + e);
        }
    return jArray;
}}

utentii.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="20sp" >

Image of the problem

最佳答案

没有。 runOnUiThread() 是必需的,因为您要调用 setListAdapter

再次。 - 移动这两行

ListAdapter adapter = new SimpleAdapter(Utenti.this, mylist , R.layout.utentii,new String[] { "name" },new int[] { 1});
setListAdapter(adapter);

紧接在 onClick() 方法中的 for(){} 循环之后。

如果您确定您的 mylist 列表中填充了您的 json 调用中的数据。

基本上是这样的示例:

将您的 xml 文件内容替换为以下内容:

测试文件

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" /> 

对于 ListView 的行

行.xml

 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/textView" android:layout_gravity="center"/>
</LinearLayout>

然后是 onCreate():

  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.test);
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy);

        ListView lv = getListView();
        populateListView();

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                populateListView();
            }
        });

    }

    private void populateListView(){

        Thread t = new Thread(new Runnable (){

            public void run() {

                JSONObject json = getUserObject("http://myhost:8080/login/email");
                Log.i("json",json.toString());

                try {
                    //Get the element that holds the earthquakes ( JSONArray )
                    JSONArray friends = json.getJSONObject("user").getJSONArray("friends");

                    final List<Map<String, String>> mylist =
                            new ArrayList<Map<String, String>>();

                    //get list of friend ids in the user object
                    for(int i=0;i < friends.length();i++){
                        Map<String,String> map = new LinkedHashMap<String, String>();
                        map.put("friendid", friends.getString(i));
                        mylist.add(map);

                    }
                    runOnUiThread(new Runnable() {
                        public void run() {
                            ListAdapter adapter = new SimpleAdapter(MyTestListActivity.this, mylist , R.layout.row,new String[] { "friendid" },new int[] {R.id.textView});
                            setListAdapter(adapter);
                        }
                    });

                } catch (JSONException e) {
                    System.out.println("4");
                    e.printStackTrace();
                }

            }
        });
        t.start();

    }

    public  static JSONObject getUserObject(String page){

        JSONObject jArray = null;

        try
        {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(page);

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("user", "test"));
            nameValuePairs.add(new BasicNameValuePair("pwd", "test"));

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            String str = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
            try{
                jArray=new JSONObject (str);}
            catch(JSONException e){Log.d("error",e);}    

        }
        catch(Exception e)
        {
            Log.i("NetworkTest", "Network Error: " + e);
        }
        return jArray;
    }

希望这对 abit 有帮助。

关于android - Android ListView 中的 JSONArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16194355/

相关文章:

python - 仅当字符串匹配时才在 python 中连接字符串

java - 无法在 Android 中创建 sqlite 数据库

java - 安卓软键盘大小

android - Robolectric + 改造 + 单元测试

javascript - Angular JS 在 ng-repeat 中设置点击对象的值

list - number_in_month 练习(SML 列表迭代)

Android,运行时查看SQLite数据库(不像其他题)

android - 如何在调用任何api时在android中将参数作为json发布

Android:如何使用 GSON 库解析 JSON 文件?

python - 如何对N个列表的元素求和?