2015-05-09 6 views
1

Я хотел бы добавить новые элементы в ListView, чтобы включить бесконечную прокрутку.Добавить элементы в ListView

private ListAdapter adapter; 
ArrayList < HashMap < String, String >> listViewList; 

... 

class GetItems extends AsyncTask < String, String, String > { 

    protected String doInBackground(String...args) { 
     ... 

     for (int i = 0; i < items.length(); i++) { 
      ... 
      HashMap < String, String > map = new HashMap < String, String >(); 
      map.put("name_1", name_1); 
      map.put("name_2", name_3); 
      map.put("name_3", name_3); 

      listViewList.add(map); 
     } 
    } 

    protected void onPostExecute(String file_url) { 
     adapter = new CustomAdapter(Activity.this, listViewList, 
      R.layout.single_item, new String[] {}, new int[] {}); 
     setListAdapter(adapter); 
    } 
} 

GetItems класс получает новые элементы, основанные на номер страницы, которую вы предоставляете. Я хотел бы добавить новые элементы в существующие элементы ListView на onPostExecute.

Любая идея, как это сделать?

ответ

1

проверить эту библиотеку на GitHub

EDIT в соответствии с вашим комментарием:

You нужно забыть о ListActivity и что вы когда-либо слышали, что он существует, это бесполезно для того, что вы пытаетесь сделать.

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 



public class DemosAdapter extends BaseAdapter { 

    public List<DemoItem> listOfItems; 
    private View v; 
    private ViewWrapper wrapper; 
    private Context context; 

    public DemosAdapter(Context c, List<DemoItem> listOfItems) { 
     this.context = c; 
     this.listOfItems = listOfItems; 
    } 

    @Override 
    public int getCount() { 
     return listOfItems.size(); 
    } 

    @Override 
    public DemoItem getItem(int i) { 
     return listOfItems.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return 0; 
    } 

    public void sort() { 
     Collections.sort(listOfItems, new Comparator<DemoItem>() { 
      @Override 
      public int compare(DemoItem item, DemoItem item2) { 
       return item.getName().compareTo(item2.getName()); 
      } 
     }); 
    } 

    public void addItems(List<DemoItem> listOfFreshItems){ 
     listOfItems.addAll(listOfFreshItems); 
     notifyDataSetChanged(); 
    } 

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

     DemoItem itm = listOfItems.get(position); 

     v = convertView; 

     if (v == null) { 
      LayoutInflater inflater = LayoutInflater.from(context); 
      v = inflater.inflate(R.layout.demo_item, null, false); 
      wrapper = new ViewWrapper(v); 
      v.setTag(wrapper); 
     } 
     else { 
      wrapper = (ViewWrapper) v.getTag(); 
     } 

     wrapper.getTvDemoName().setText(itm.getName()); 

     return v; 
    } 

    private class ViewWrapper { 

     private View base; 
     private TextView tvDemoName; 

     public ViewWrapper(View v) { 
      this.base = v; 
     } 

     public TextView getTvDemoName() { 
      if (tvDemoName == null) { 
       tvDemoName = (TextView) base.findViewById(R.id.tvDemoName); 
      } 
      return tvDemoName; 
     } 

    } 
} 

Первый раз, когда вы добавляете данные, сделать это

demosAdapter = new DemosAdapter(this, listOfDemos); 
demosAdapter.sort(); 
lvListOfDemos.setAdapter(demosAdapter); 

Когда вы получите новые предметы, просто позвоните

adapter.addItems(List<DemoItem> newItems); 
+0

Я уже видел это, но он не показывает, как добавлять новые элементы данных в адаптер. – user3051755

+0

Я добавил демо-код. Вам нужно будет изменить его в соответствии с вашими потребностями, но вы увидите эту идею. –

1

На самом деле вам просто нужно позвонить adapter.notifyDataSetChanged в onPostExecute. Но вы не должны создавать экземпляр адаптера много раз. Это должно быть сделано только один, так в целом это будет выглядеть следующим образом

private ListAdapter adapter; 

... 
void onCreate(){ // assuming this is an activity 
    adapter = new CustomAdapter(Activity.this, listViewList, 
      R.layout.single_item, new String[] {}, new int[] {}); 
    setListAdapter(adapter); 
} 

class GetItems extends AsyncTask<String, String, String> { 
    ... 

    protected void onPostExecute(String file_url) { 
    adapter.notifyDataSetChanged(); 
    } 
} 
+0

адаптер не имеет notifyDataSetChanged(), только уведомить() и notifyAll(). – user3051755

+0

Нет, потому что ListAdapter - это просто интерфейс. Реализация зависит от вашего CustomAdapter. Хотя технически вы можете добавлять элементы для отображения адаптера, но без указанной реализации было бы невозможно, чтобы изменения вступили в силу. – inmyth

Смежные вопросы