Добавить новые элементы из пользовательского адаптера в ListView - PullRequest
1 голос
/ 01 июня 2011

У меня есть 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 Ответ

3 голосов
/ 01 июня 2011

Это зависит от вашей реализации 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();
    }
});

Это непросто, не зная, какие данные вы используете или есть ли у вас весь набор данных, доступный в начале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...