2013-10-17 47 views
0

我正在製作一個應用程序,從網絡獲取一些數據作爲JSON,然後它應該顯示在列表視圖中。使用JSONArray數據的ArrayAdapter不調用getView()

到目前爲止,我有一個類獲取數據,併成功並按預期工作,然後我有一個自定義的ArrayAdapter類。當我使用soem Log.d()在不同的地方運行代碼來檢查代碼是否正常工作時,應用程序將打開,下載JSON並將其發送回我的活動,然後將數據發送到數組適配器成功

(通過調用發送到適配器的數據中的第一個JSONObject的字段來測試此操作)。

據我所知,問題在於getView()方法在它應該被調用時沒有被調用。

代碼:

try { 

     listAdapter = new CropListAdapter(this, R.layout.crop_listitem, 
       crops.getJSONArray("crops")); 

     listView.setAdapter(listAdapter); 

     // setUpViews(); 

    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Adapater:

public class CropListAdapter extends ArrayAdapter<JSONArray> { 

    Context context; 
    JSONArray data; 
    int layoutResourceId; 
    CropHolder cropHolder; 

    public CropListAdapter(Context context, int layoutResourceId, JSONArray data) { 

     super(context, layoutResourceId); 
     // TODO Auto-generated constructor stub 

     this.context = context; 
     this.data = data; 
     this.layoutResourceId = layoutResourceId; 
     this.cropHolder = null; 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent) { 
     Log.d("Working", "works here 38"); 
     View row = convertView; 

     JSONObject crop; 
     try { 
      Log.d("Pos", Integer.toString(pos)); 
      crop = (JSONObject) data.getJSONObject(pos); 

      if (row == null) { 

       LayoutInflater inflater = ((Activity) context) 
         .getLayoutInflater(); 
       row = inflater.inflate(layoutResourceId, parent, false); 

       cropHolder = new CropHolder(); 
       cropHolder.tvCropId = (TextView) row 
         .findViewById(R.id.tvCropId); 
       cropHolder.tvCropName = (TextView) row 
         .findViewById(R.id.tvCropName); 
       cropHolder.ivCropImage = (ImageView) row 
         .findViewById(R.id.ivCropImage); 

       row.setTag(cropHolder); 

      } else { 

       cropHolder = (CropHolder) row.getTag(); 

      } 

      cropHolder.tvCropId.setText(crop.getString("crop_id")); 
      cropHolder.tvCropName.setText(crop.getString("name")); 
      Log.d("Item", "creating item " + crop.getString("name")); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return row; 
    } 

    static class CropHolder { 

     TextView tvCropName; 
     ImageView ivCropImage; 
     TextView tvCropId; 

    } 
} 
+0

只是一個大約的實施建議,您不妨到您的JSON轉換成一個原生對象作爲中間數據,你應該不斷切換你的從JSON到XML(或任何其他)的Web服務。只是我的2分。 –

回答

0

如果認爲在這種情況下應該覆蓋BaseAdapter。順便說一句,如果你想getView()得到叫你必須覆蓋getCount(),讓它返回data. length()

0

我看不到你在哪裏覆蓋getCount()方法,您的列表適配器列表返回0作爲元素的數量,你需要覆蓋它並返回JSONArray中的元素數

0
  1. 首先,這不是一個好主意,做這個「crops.getJSONArray(」作物「)」,似乎是,你正在用同步調用下載你的jsonArray。如果它是同步的,那麼應用會在較新的Android版本上崩潰。您必須執行異步下載任務,完成後必須通知適配器數據已更新。它會刷新列表。

  2. 在GetView方法中解析json也是一個壞主意,它會影響listview的平滑滾動,並且如果你沒有正確處理異常,會導致應用程序崩潰。下載並解析它之後,您應該將json數據加載到某些數據結構中。然後您可以在getView中使用它們。

  3. 在這種情況下,您應該通過擴展BaseAdapter來製作適配器,它更容易且更具可定製性,這就是爲什麼在所有情況下都能很好地工作。

希望這會有所幫助。

0

嘗試像在getView這

()方法

LayoutInflater inflater = (LayoutInflater) context 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
row = inflater.inflate(layoutResourceId,null); 
相關問題