1

我是 Android 开发的新手。

我纯粹喜欢在我的简单应用程序中使用 JSON 对象和数组,考虑到 JSON 载体与 XML 相比的轻量级。

我在使用 ArrayAdapter 填充 ListView 时遇到了挑战。

这就是我克服并需要你的建议的方式。

Extend the Adaptor class.

然后将 JSONArray 传递给构造函数。
在这里,构造函数调用 super 并使用虚拟字符串数组设置 JSONArray 的长度。
将构造函数参数存储在类中以供进一步使用。

public myAdaptor(Context context, int resource, JSONArray array)
{
    super(context, resource, new String[array.length()]);
    // Store in the local varialbles to the adapter class.
    this.context = context;
    this.resource = resource;
    this.profiles = objects;
}

getView()将完成从 JSONArray获取JSONObjects 以构建视图的工作。

public View getView(int position, View convertView, ViewGroup parent)
{
    View view;
    if (convertView == null)
    {
        LayoutInflater inflater = (LayoutInflater) 
            context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(resource, parent, false);
    }
    else
    {
        view = convertView;
    }

    // Here 
    JSONObject item = (JSONObject) profiles.getJSONObject(position);

    // READY WITH JSONObject from the JSONArray
    // YOUR CODE TO BUILD VIEW OR ACCESS THE 
}

现在有任何改进/建议/深思熟虑的问题吗?

4

4 回答 4

7

我建议您使用 google GSON 而不是 JSON。它是一个库,可让您从 JSON 请求创建对象,您无需再解析 JSON。只需创建一个包含 JSON 请求中的所有字段并命名相同的对象,然后随心所欲地使用它 - 例如:

Your JSON request
{
    [
        {
            "id": "2663",
            "title":"qwe"

        },
        {
            "id": "1234",
            "title":"asd"
        },
        {
            "id": "5678",
            "title":"zxc"
        }

    ]
}

你的班级 - JSON-Array 的项目

 public class MyArrayAdapterItem{
     int id;
     String title;
 }

在您下载数据的代码中的某个位置。我不知道你是怎么做的,所以我会发布我的代码,例如:

mGparser = new JsonParser();
Gson mGson = new Gson();

Url url = "http://your_api.com"
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Connection", "close");
conn.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

JsonArray request = (JsonArray) mGparser.parse(in.readLine());
in.close();
ArrayList<MyArrayAdapterItem> items = mGson.fromJson(request, new TypeToken<ArrayList<MyArrayAdapterItem>>() {}.getType());

就是这样,现在只需在适配器的构造函数中放入“items”而不是 JSON-array

于 2013-12-09T09:57:24.333 回答
3

您可以将 null 传递给 super 而不是创建字符串数组并实现 getCount 方法:

public myAdaptor(Context context, int resource, JSONArray array)
{
    super(context, resource, null);
    // Store in the local varialbles to the adapter class.
    this.context = context;
    this.resource = resource;
    this.profiles = array;
}

public int getCount(){
   return profiles.length();
}
于 2013-12-09T09:37:29.090 回答
0

创建一个文本视图并使用 item.getString("key") 分配并将该字符串添加到本地字符串数组并返回该视图

于 2013-12-09T09:29:31.053 回答
0

这是列表视图适配器类。

public class Adapter extends BaseAdapter {
    Context context = null;
    ArrayList<OffersAvailable> offers = null;


    public Adapter(Context context, ArrayList<OffersAvailable> offer) {
        this.context = context;
        this.offers = offer;

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return offers.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return offers.get(position).getTitle();
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        View v;
        final TextView tvpoints;
        final TextView tv,tv_quantity;
        if (convertView == null) {
            LayoutInflater li = ((Activity) context).getLayoutInflater();
            v = li.inflate(R.layout.design_userlist, null);

        } else {
            v = convertView;
        }
        tvpoints = (TextView) v.findViewById(R.id.tvpointlist);
        tv_quantity= (TextView) v.findViewById(R.id.tv_quantity);
        tv = (TextView) v.findViewById(R.id.tvdatalist);
        ((Activity) context).runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                tv.setText(offers.get(position).getTitle().toUpperCase());
                tv_quantity.setText(offers.get(position).getQuatity().toUpperCase());
                tvpoints.setText(offers.get(position).getPoint() + "");
            }
        });

        return v;
    }

}

对象类

public class OffersAvailable {
    String title, point, quatity, description,nid;

    public String getNid() {
        return nid;
    }

    public void setNid(String nid) {
        this.nid = nid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getPoint() {
        return point;
    }

    public void setPoint(String point) {
        this.point = point;
    }

    public String getQuatity() {
        return quatity;
    }

    public void setQuatity(String quatity) {
        this.quatity = quatity;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

使用主类中的json并将其存储在OffersAvailable类型的Arraylist中。

并将其传递给 listviews 适配器。如果您从互联网上获得响应,请使用 asynchttpclient 方法。并解析 json。

于 2013-12-09T09:31:28.593 回答