0

私のアプリでは、以下のクラスが JSONArray を受け取り、そのデータを使用して ListView を設定します。この ListView のフィールドをアルファベット順に表示したいと考えています。したがって、データを使用する前に JSONArray を並べ替えたいと思います。

GSON または Jackson の使用を提案するトピックをいくつか見ましたが、これをより簡単な方法で実行しようとしています。私はこれらのライブラリをよく理解しておらず、チュートリアルで必要なものを見つけられませんでした。

JSON の例:

{"0":["1","Alimentos e Bebidas","Y"],"1":["6","Beleza e Cosm\u00e9ticos","Y"],"2":
["11","Cama, Mesa e Banho","Y"],"3":["3","CDs, DVDs e Games","Y"],"4":["2","Convites 
e Cortesias","Y"],"5":["23","Cursos","Y"],"6":["8","Eletr\u00f4nicos","Y"],"7":
["16","Esporte e Lazer","Y"],"8":["14","Inform\u00e1tica e Acess\u00f3rios","Y"],
"9":["10","Limpeza","Y"],"10":["4","Livros","Y"],"11":["21","Livros no Sebo","Y"],
"12":["5","Outros","Y"],"13":["12","Roupas e Acess\u00f3rios","Y"]}

リストにデータを入力してユーザーを待つクラスのメソッド:

public void proccess(){
    listview = (ListView) findViewById(R.id.include3);

    int qtdCategorias = json.length();
    categorias = new String[qtdCategorias];
    itens = new ArrayList<ItemListView>();
    for (int i=0; i<qtdCategorias; i++){
        c = json.optJSONArray(i);
        String nomeCategoria = null;
        try {
            nomeCategoria = c.getString(1); //A consulta SQL do php retorna somente categorias habilitadas
        } catch (JSONException e) {
            Log.e("CategoriasShoppingActivity", e.toString());
            e.printStackTrace();
        }
        categorias[i] = nomeCategoria;
        //ItemListView item = new ItemListView(nomeCategoria);
        //itens.add(item);
    }

    Arrays.sort(categorias);

    for (int i=0; i<qtdCategorias; i++){
        ItemListView item = new ItemListView(categorias[i]);
        itens.add(item);
    }


    adapterListView = new AdapterListView(this, itens);
    listview.setAdapter(adapterListView);


    listview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {
            c = json.optJSONArray(position);
            String name = null;
            String idt = null;
            try {
                name = c.getString(1);
                idt = c.getString(0);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            Intent in = new Intent(getApplicationContext(), ProdutosActivity.class);
            in.putExtra(TAG_NAME, name);
            in.putExtra(TAG_ID, idt);
            startActivity(in);
        }
    });




    }

[編集] サーバーからデータを要求するには、次の JSONParser クラス () を使用します。

public class JSONParser{

static InputStream is = null;
static JSONArray jArr = null;
static JSONStringer jArrString = null;
static String json = "";
private static Context context;
private ProgressDialog loader;

// static HttpEntity httpEntity = null;

// constructor
public JSONParser() {


}



public JSONArray getJSONFromUrl(String url, List<NameValuePair> params) {

    // Making HTTP request
    try {
        // defaultHttpClient
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));



        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();



        // json = EntityUtils.toString(httpEntity);
        // HttpEntity httpEntity2 = httpEntity;
        json = EntityUtils.toString(httpEntity);
        // is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        Log.e("JSONParser", "IOException "+e.toString());
        e.printStackTrace();
    } 

    try {

        char[] c = new char[json.length()];
        json.getChars(0, json.length(), c, 0);
        int i = 0;
        while (c[i] == '\u00EF' || c[i] == '\u00BB' || c[i] == '\u00BF') { // remove
                                                                            // utf-8
                                                                            // BOM
            i++;
        }
        json = json.substring(i);


        Log.e("JSON", json);
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        JSONObject json_data = new JSONObject(json);
        JSONArray hashMap_names = json_data.names();
        JSONArray hashMap_names2 = new JSONArray();
        Map hashMap = new HashMap(json_data.length());
        for (int i = 0; i != hashMap_names.length(); i++) {
            hashMap.put(String.valueOf(i), json_data.get(String.valueOf(i)));
            hashMap_names2.put(String.valueOf(i));
        }
        JSONObject hashMap_obj = new JSONObject(hashMap);

        jArr = hashMap_obj.toJSONArray(hashMap_names2);

        // jArr = new JSONArray(json);
        Log.e("JSON Parser", "succesful parsing data " + jArr.toString());
    } catch (Exception e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
        jArr = null;
    }

    // return JSON String
    return jArr;

}

そしてここで、クラスで JSON を受け取ります

protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if (requestCode == 1){
        if (resultCode == RESULT_OK){
            try {
                json = new JSONArray(data.getStringExtra(TAG_JSON));
                Log.e("CategoriasShoppingActivity", "JSON: "+json);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            proccess();
        }else{ // resultCode == RESULT_CANCELED
            Log.d("CategoriasJogarActivity", "AsyncTaskActicity retornou RESULT_CANCELED");
            finish();
        }
    }
}
4

2 に答える 2

1

サーバー側のコードにアクセスできる場合は、そこでリストを並べ替える方が簡単です。そうでない場合、これを行う唯一の方法は、それを解析して ArrayList にし、既知のアルゴリズムを使用して単純に並べ替えることです。

于 2012-09-11T15:22:12.907 に答える
0

シリアライズする前にソートしてみませんか?Comparator インターフェイスを使用し、Collections.sort を使用して並べ替えます。ソート時にコンパレータをパラメータとして渡します

于 2012-09-11T15:13:23.580 に答える