如何将JSONArray转换为ListView?

5

我有一段代码,它实现以下功能:

  1. 通过HttpClient连接到PHP文件的Web服务
  2. 返回SQL查询结果
  3. 返回格式为jArray(一个JSONArray)

for(int i=0; i < jArray.length() ; i++) {
    json_data = jArray.getJSONObject(i);
    int id=json_data.getInt("id");
    String name=json_data.getString("name");
    Log.d(name,"Output");
}

当我查看LogCat时,我看到所有查询的“名称”,每个记录都被打印出来。我只需要将这些结果插入到ListView中即可。我该怎么做?
附注:我没有为ArrayAdapter创建单独的类。这可能是原因吗?

1
这个问题在SO上已经有很多类似的提问了 - 你是否浏览过那些?如果你只想显示一个名称列表,那么无需子类化ArrayAdapter。 - MH.
4个回答

9

如果您只想显示一组TextView,无需覆盖任何内容,只需将所有项目添加到ArrayList中并使用ArrayAdapter即可。

在XML中放置一个名为android:list的ListView,然后使用您要使用的TextView创建ArrayAdapter。

之后,您只需调用setListAdapter(mArrayAdapter),它应该填充您的列表。

ArrayList<String> items = new ArrayList<String>();
for(int i=0; i < jArray.length() ; i++) {
    json_data = jArray.getJSONObject(i);
    int id=json_data.getInt("id");
    String name=json_data.getString("name");
    items.add(name);
    Log.d(name,"Output");
}

ArrayAdapter<String> mArrayAdapter = new ArrayAdapter<String>(this,  
           android.R.layout.simple_expandable_list_item_1, items));
setListAdapter(mArrayAdapter)

希望这能帮到你!

谢谢,这正是我想要的。我知道这可能不是最好的方法,但是我只想要一个可行的模型,因为我快要被这个问题搞疯了。现在我会考虑让这个程序更加高效。非常感谢你。 - Beetle

2

我不喜欢在已经有JSON数组的情况下重新映射数据,所以这是我的代码...对我来说足够简单...希望能帮到你。

package ...;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

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

public class DataListFragment extends ListFragment{
    JSONArray data;

    public DataListFragment(){

    }

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.i("mycode", "DataListFragment onActivityCreated");
        data=((MainActivity)this.getActivity()).data;
        Log.i("mycode", "data length "+data.toString());
        setEmptyText("No Data Here");
        final JSONArrayAdapter adapter = new JSONArrayAdapter(this.getActivity(),data);
        setListAdapter(adapter);

        // Start out with a progress indicator.
        //setListShown(false);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Insert desired behavior here.
        Log.i("mycode", "Item clicked: " + id);
    }

    private class JSONArrayAdapter extends BaseAdapter {
        JSONArray data;
        Context context;

        public JSONArrayAdapter(Context context,JSONArray data) {
            super();
            this.context=context;
            this.data=data;
        }

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

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            try {
                return data.getJSONObject(arg0);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        public long getItemId(int arg0) {
            return arg0;
        }

        @Override
        public boolean hasStableIds(){
            return true;
        }

        @Override
        public boolean isEmpty(){
            return data==null || data.length()==0;
        }

        @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.single_item, parent, false);
            TextView textView1 = (TextView) rowView.findViewById(R.id.firstLine);
            TextView textView2 = (TextView) rowView.findViewById(R.id.secondLine);
            //ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
            try {
                JSONObject jo = (JSONObject) data.get(position);
                textView1.setText(jo.getString("category_title"));
                textView2.setText(jo.getString("description"));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return rowView;
        }

    }

}


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="6dip"
        android:contentDescription="icon"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/secondLine"
        android:layout_width="fill_parent"
        android:layout_height="26dip"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@id/icon"
        android:ellipsize="marquee"
        android:singleLine="true"
        android:textSize="12sp" />

    <TextView
        android:id="@+id/firstLine"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/secondLine"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_alignWithParentIfMissing="true"
        android:layout_toRightOf="@id/icon"
        android:gravity="center_vertical"
        android:textSize="16sp" />

</RelativeLayout> 

这是个很棒的答案,顺便说一下。 - mhdjazmati

1
在你的for循环中,你应该加载一个包含你想要插入到列表中的值的数组列表。 注意示例中使用了以下代码:
ArrayList> mylist = new ArrayList>();
而你有一个整数和一个字符串要添加到结构中,所以你可以将那个ID转换为字符串,问题就解决了。 之后,你可以使用一个列表适配器,而不需要创建一个单独的类:
ListAdapter adapter = new SimpleAdapter(this, mylist, R.layout.main, new String[] { "name", "id" }, new int[] { R.id.item_title, R.id.item_subtitle });
其中"name"和"id"将是你的映射中用于名称和ID值的键,由json返回,item_title和item_subtitle是用于“适应”文本的视图。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接