将自定义适配器中的新元素附加到ListView

时间:2011-06-01 08:08:14

标签: android listview append

我有ListView的“显示下一个结果”按钮。该列表由扩展BaseAdapter的自定义适配器填充。如下所示使用它,只显示新结果。

如何将新结果附加到列表中?

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

1 个答案:

答案 0 :(得分: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();
    }
});

如果不知道您正在使用哪些数据或者您是否在开始时拥有整个数据集,那就很棘手。