2013-12-09 3 views
1

Я новичок в разработке Android.Android ArrayAdapter и JSONArray

Я просто люблю работать с объектами и массивами JSON для моего простого приложения, учитывая легкость JSON Carrier по сравнению с XML.

У меня возникли проблемы с ArrayAdapter для заполнения ListView.

Вот как я преодолел и вам нужны ваши предложения.

Extend the Adaptor class. 

Затем передайте конструктор JSONArray в конструктор.
Здесь конструктор вызывает супер с dummy Строковый массив, задающий длину 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() будет выполнять работу забирающий JSONObjects от JSONArray построить вид.

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 
} 

Теперь Любые улучшения/предложения/Thoughful-вопрос ??

+0

это кажется нормально. еще одна вещь, которую вы можете попробовать, - преобразовать массив json в массив/arraylist объектов, а затем начать обработку. –

+0

imo, вместо предоставления JSONArray вы должны передать результат прохождения и не анализировать информацию каждый раз, когда вы прокручиваете вверх/вниз свой список – Blackbelt

+0

вместо того, чтобы много работать в 'getView', используя структуру данных, такую ​​как ArrayList, HashMap ,. . передать анализируемые значения в классе 'myAdaptor'. –

ответ

6

Я бы посоветовал вам использовать Google GSON вместо JSON. Это библиотека, которая дает вам объекты создания из JSON-запроса, и вам не нужно разбирать JSON каждый раз. Просто создать объект, который содержит все поля из запроса JSON и с таким же именем, и делать с ней все, что вы хотите - например:

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

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

    ] 
} 

Вашего класс - предмет JSON-массив

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()); 

Так вот и все, сейчас просто поставить «элементов» вместо JSON-массива в конструкторе вашего адаптера

+0

спасибо за предложение, это кажется интересным. его новое обучение. –

+1

В будущих проектах вы получите «большую прибыль» от использования gson вместо json, это сэкономит ваше время. Таким образом, чтобы получить данные от запроса, вам нужно добавить несколько строк в свой код, вместо этого раздражающий, скучный и незаметный JSON-синтаксический анализ. – whizzzkey

+1

Да, реализовано. это действительно помогло. –

0

создать один TextView и назначить с item.getString («ключ») и добавить эту строку в локальном массиве строк и возвращает этот вид

0

Это класс ListView адаптер.

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 в главном классе и хранить его Inthe Arraylist типа OffersAvailable.

и передать его в адаптер списка. , если вы получаете ответ от интернета, используйте метод asynchttpclient. И проанализируйте json.

+0

приятно объяснил. Благодарю. –

1

Вы можете передать нуль в супер вместо создания массива строк и реализовать метод 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(); 
} 
+1

Это сложный вопрос .. хороший .. Предложение. Невозможно передать null супер конструктору. вместо этого передаются только первые 2 аргумента. что будет делать. –

Смежные вопросы