【问题标题】:Create ArrayAdapter<String> from SimpleAdapter从 SimpleAdapter 创建 ArrayAdapter<String>
【发布时间】:2014-12-15 16:51:54
【问题描述】:

我创建了一个带有 HashMap 的 simpleadapter 来检索 json 数据。它可以工作,但我会创建一个 ArrayAdapter。这是带有 json 解析的简单适配器:

@Override
          protected void onPostExecute(JSONObject json) {
              pDialog.dismiss();
          try {
             // Getting JSON Array from URL
              rating = json.getJSONArray(TAG_ITEM);

             for(int i = 0; i < rating.length(); i++)
             {
                 JSONObject c = rating.getJSONObject(i);
                 // Storing  JSON item in a Variable
                 String name = c.getString(TAG_NOME);
                 String commento = c.getString(TAG_COMMENTO);
                 String valore = c.getString(TAG_VALORE);
                 urlImage = c.getString(TAG_URLIMAGE);
                 String timestamp = c.getString(TAG_TIMESTAMP);        

                 // Adding value HashMap key => value
                 HashMap<String, String> map = new HashMap<String, String>();
                 map.put(TAG_NOME, name);
                 map.put(TAG_COMMENTO, commento);
                 map.put(TAG_URLIMAGE, urlImage);
                 map.put(TAG_VALORE, "Voted: "+valore);
                 map.put(TAG_TIMESTAMP, timestamp);
                 oslist.add(map);

                 ListAdapter adapter = new SimpleAdapter(RatingDetailsActivty.this, oslist, R.layout.list_rating_item,
                     new String[] 
                             { TAG_NOME,
                               TAG_COMMENTO,
                               TAG_VALORE,
                               TAG_TIMESTAMP
                              }, new int[] 
                                      {
                                        R.id.nome,
                                        R.id.commento, 
                                        R.id.valore, 
                                        R.id.timestamp
                                    })
                 {


                        @Override
                        public View getView(int position, View convertView, ViewGroup parent) {
                            View v = super.getView(position, convertView, parent);

                            ImageView profileImage = (ImageView) v.findViewById(R.id.profile_img);
                            try {
                                @SuppressWarnings("unchecked")
                                HashMap<String, String> map = (HashMap<String, String>) getItem(position);
                                URL url = new URL(map.get(TAG_URLIMAGE));
                                imageProfilo = BitmapFactory.decodeStream(url.openConnection().getInputStream());
                                Log.i("Url immagine", url.toString()); // here there is only last one

                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            if (imageProfilo != null) {
                                profileImage.setImageBitmap(imageProfilo);
                            } else {
                                profileImage.setImageDrawable(v.getResources() .getDrawable(R.drawable.welcome));
                            }
                            return v;

                        }

                 };
                 list.setAdapter(adapter);

            }
         } catch (JSONException e) {
           e.printStackTrace();
         }
        }

我尝试改造这个简单的适配器并以这种方式创建一个 ArrayAdapter:

 @Override
          protected void onPostExecute(JSONObject json) {
              pDialog.dismiss();
          try {
             // Getting JSON Array from URL
              rating = json.getJSONArray(TAG_ITEM);

             for(int i = 0; i < rating.length(); i++)
             {
                 JSONObject c = rating.getJSONObject(i);
                 // Storing  JSON item in a Variable
                 String name = c.getString(TAG_NOME);
                 String commento = c.getString(TAG_COMMENTO);
                 String valore = c.getString(TAG_VALORE);
                 urlImage = c.getString(TAG_URLIMAGE);
                 String timestamp = c.getString(TAG_TIMESTAMP);


                 nomi.add(name);
                 commenti.add(commento);
                 valori.add(valore);
                 timestamps.add(timestamp);
                 adapter = new DetailsListAdapter(RatingDetailsActivty.this, nomi, valori, commenti, timestamps);
                 list.setAdapter(adapter);
            }
         } catch (JSONException e) {
           e.printStackTrace();
         }
        }

声明为全局变量:

ArrayList<String> nomi; 
ArrayList<String> valori; 
ArrayList<String> commenti; 
ArrayList<String> timestamps; 

这是适配器:

public class DetailsListAdapter extends ArrayAdapter<String>{

    //riferimenti statici alle risorse e agli id
    private final static int LAYOUT = R.layout.list_rating_item;
    private final static int NOME = R.id.nome;
    private final static int VALORE = R.id.valore;
    private final static int COMMENTO = R.id.commento;
    private final static int TIMESTAMP = R.id.timestamp;

    ArrayList<String> nomi = null; //lista dei nomi
    ArrayList<String> valori; //lista dei valori
    ArrayList<String> commenti; //lista dei commenti
    ArrayList<String> timestamps; //lista dei ts

    ArrayList<String> array;
    Context c; //context
    LayoutInflater inflater; //layout inflater

    public DetailsListAdapter(Context context, ArrayList<String> nomi, ArrayList<String> valori, ArrayList<String> commenti, ArrayList<String> timestamps)
    {
        super(context,NOME);
        this.c = context;
        this.nomi = nomi;
        this.valori = valori;
        this.commenti = commenti;
        this.timestamps = timestamps;

        this.inflater = LayoutInflater.from(c);
        this.array = new ArrayList<String>();
        this.array.addAll(nomi);
    }

    @Override
    public int getCount()
    {
        return nomi.size(); //ritorno lunghezza lista ( = numero dei titoli)
    }



    //quando la lista richiede una view
    @Override
    public View getView(int pos,View view,ViewGroup parent)
    {
        CacheRiga cache; //cache
        if(view==null)//se è la prima volta che viene richiesta la view
        {
            // creo la view ma non l'attacco alla lista in quanto devo ancora modificare
            // i testi delle textview
            String data = nomi.get(pos);
            view = inflater.inflate(LAYOUT, parent,false); 
            cache = new CacheRiga(); //inizializzo la cache
            cache.nome = (TextView) view.findViewById(NOME); //collego titolo
            cache.commento = (TextView) view.findViewById(VALORE);//collego descrizione
            cache.valore = (TextView) view.findViewById(COMMENTO);//collego descrizione
            cache.timestamp = (TextView) view.findViewById(TIMESTAMP);//collego descrizione
            view.setTag(cache);//collego view con cache

        }
        else
        {
            cache = (CacheRiga) view.getTag(); //altrimenti prendo la cache dalla view
        }

        cache.nome.setText(nomi.get(pos)); //imposto il titolo
        cache.commento.setText(commenti.get(pos)); // e la descrizione
        cache.valore.setText(valori.get(pos)); // e la descrizione
        cache.timestamp.setText(timestamps.get(pos)); // e la descrizione

        return view;
    }



    private class CacheRiga { 
        public TextView nome; // cache titolo
        public TextView commento; // cache descrizione
        public TextView valore;
        public TextView timestamp;
    }

}

nomi.add(name); 中的应用程序崩溃说该值为 null...有什么问题吗?

【问题讨论】:

  • 确保在RatingDetailsActivty Activity 中初始化nomi
  • 好吧,我认为..是的..但我从不将简单的适配器转换为 ArrayAdapter..我不确定这种方式是否正确
  • 这里的名字 nomi.add(name);不为空..

标签: java android json android-arrayadapter simpleadapter


【解决方案1】:

与您在第一种情况中提到的相同: 将整个 hashmap 列表传递给 arrayadapter,而不是传递不同的 aarraylist。

在将适配器扩展到 Aarayaadapter 时,使用 hashmap 作为泛型而不是字符串 .. ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多