2011-06-01 45 views
1

我有一個ListView帶有「顯示下一個結果」按鈕。該列表由延伸到BaseAdapter的自定義適配器填充。如下所示使用它,只顯示新的結果。將自定義適配器中的新元素添加到ListView中

如何將新結果追加到列表中?

ListView listView = (ListView)findViewById(android.R.id.list); 

// Show next results button     
View footerView = ((LayoutInflater)ItemList.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_listview, null, false); 
listView.addFooterView(footerView); 

footerView.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     Intent i = getIntent();        
     i.putExtra("firstIndex", mFirstIndex + NRES_PER_PAGE); 
     i.putExtra("itemCount", NRES_PER_PAGE); 
     startActivity(i); 
    } 
}); 

mItems = json.getJSONArray("data");      
setListAdapter(new ItemAdapter(ItemList.this, mType, mItems)); 

FIX

ListActivity

public class ItemList extends MenuListActivity{ 

    ItemAdapter mItemAdapter; 

    Integer mFirstIndex = 0; 

    JSONArray mItems = new JSONArray(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  

     setContentView(R.layout.item_list); 

     // Set data adapter 
     mItemAdapter = new ItemAdapter(ItemList.this, mType, mItems); 

     ListView listView = (ListView)findViewById(android.R.id.list);      
     View footerView = ((LayoutInflater)ItemList.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_listview, null, false); 
     listView.addFooterView(footerView); 

     footerView.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       progressDialog = MyProgressDialog.show(ItemList.this, null, null); 
       mFirstIndex = mFirstIndex + ITEM_COUNT; 
       new GetItemInfoList().execute(); 
      } 
     }); 

     setListAdapter(mItemAdapter); 

     new GetItemInfoList().execute(); 
    }  

    private class GetItemInfoList extends AsyncTask<Void, Void, JSONObject> { 
     protected JSONObject doInBackground(Void... params) { 

      // Set POST data to send to web service 
      List<NameValuePair> postData = new ArrayList<NameValuePair>(2);    
      postData.add(new BasicNameValuePair("firstindex", Integer.toString(mFirstIndex))); 
      postData.add(new BasicNameValuePair("itemscount", Integer.toString(ITEM_COUNT))); 
      JSONObject json = RestJsonClient.getJSONObject(URL_ITEMINFOLIST, postData);    
      return json; 
     } 

     protected void onPostExecute(JSONObject json) { 

      try {    
        // Get data from json object and set to list adapter 
        JSONArray jsonArray = json.getJSONArray("data"); 
        for(int i=0; i<jsonArray.length(); i++) 
         mItems.put(jsonArray.get(i)); 

        mItemAdapter.notifyDataSetChanged(); 

        ListView listView = (ListView)findViewById(android.R.id.list);      
        View footerView = ((LayoutInflater)ItemList.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_listview, null, false); 
        listView.addFooterView(footerView); 

        footerView.setOnClickListener(new View.OnClickListener() { 
         public void onClick(View v) { 
          progressDialog = MyProgressDialog.show(ItemList.this, null, null); 
          mFirstIndex = mFirstIndex + ITEM_COUNT; 
          new GetItemInfoList().execute(); 
         } 
        });    

      } catch (JSONException e) {    
      } 
     } 
    } 

} 

適配器

public class ItemAdapter extends BaseAdapter { 

    private Context mContext; 
    private LayoutInflater mInflater; 
    private JSONArray mItems; 
    private ImageLoader mImageLoader; 
    private int mCategory; 

    public ItemAdapter(Context context, int category, JSONArray items) { 
     mContext = context;   
     mInflater = LayoutInflater.from(context);   
     mItems = items; 
     mCategory = category; 
     this.mImageLoader = new ImageLoader(context, true); 
    } 

    public int getCount() { 
     return mItems.length(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder holder;   

     if (convertView == null) { 

      convertView = mInflater.inflate(R.layout.item_row, null);   
      holder = new ViewHolder(); 

      holder.listitem_pic = (ImageView) convertView.findViewById(R.id.listitem_pic); 
      holder.listitem_desc = (TextView) convertView.findViewById(R.id.listitem_desc); 
      holder.listitem_title = (TextView) convertView.findViewById(R.id.listitem_title); 

      convertView.setTag(holder); 

     } else {   
      holder = (ViewHolder) convertView.getTag(); 
     } 

     try { 

      JSONObject item = mItems.getJSONObject(position); 

      String listitem_pic = item.getString("picture"); 
      holder.listitem_pic.setTag(listitem_pic); 
      mImageLoader.DisplayImage(listitem_pic, (Activity)mContext, holder.listitem_pic); 

      holder.listitem_title.setText(item.getString("title")); 
      holder.listitem_desc.setText(item.getString("desc")); 

     }  
     catch (JSONException e) {   
     } 

     return convertView; 
    } 

    static class ViewHolder {  
     TextView listitem_title; 
     ImageView listitem_pic;  
     TextView listitem_desc; 
    } 
} 
+0

'如何顯示下一個結果'按鈕 – ingsaurabh 2011-06-01 08:11:29

+0

這取決於您對ItemAdapter的實現,我建議持有對ItemAdapter的引用,然後更新其後面的數據集,然後調用它的notifyDataSetChanged()。 – GeekYouUp 2011-06-01 08:17:45

+0

@Saurabh Agnihotri footerView是按鈕,因此代碼位於其onClick處理程序中。 – jul 2011-06-01 08:17:51

回答

3

這取決於具體的實現ItemAdapter的,我建議你抱着ItemAdapter參考,然後更新數據在它後面設置,然後調用notifyDataSetChanged()。是這樣的:

ItemAdapter ia = new ItemAdapter(ItemList.this, mType, mItems); 
setListAdapter(ia); 

footerView.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     mItems.append(newItems); 
     ia.notifyDataSetChanged(); 
    } 
}); 

這是棘手的不知道你使用的是什麼數據,或者是否有整的數據,在開始時設置可用。

相關問題