开发者

Append new elements from custom adapter to ListView

I've got a ListView with a 'show next results' button. The list is filled by a custom adapter extending BaseAdapter. Using it as shown below, only the new results are shown.

How can I append the new results to the list?

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) {               
            }
        }
    }

}

Adapter

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(in开发者_开发问答t 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;  
    }
}


It depends on your implementation of ItemAdapter, I'd recommend holding a reference to ItemAdapter, then updating the data set behind it and then calling notifyDataSetChanged() on it. something like:

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

It is tricky without knowing what data you are using or whether you have the entire data set available at the start.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜