2014-09-17 2 views
0

в простом ListView в моем приложении. Я хочу добавить элементы в конец списка при завершении прокрутки и обновлении. мой код работает только для передачи данных в ListView, и он не работает для добавления в конец списка и обновления. пожалуйста, помогите мне решить эту проблему. Благодарю.Android Refresh ListView от ArrayAdapter

private ItemAdapter adapter; 

public class ReceivedFragment extends ListFragment implements AbsListView.OnScrollListener { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     items = new ArrayList<Item>(); 

     for (int i=0; i<=10; i++){ 
      String a = String.format("title %s", i); 
      String b = String.format("description %s", i); 
      Item item = new Item(a , b , String.valueOf(i)); 
      items.add(item); 
     } 
     adapter = new ItemAdapter(getActivity(), items); 
     setListAdapter(adapter); 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

    @Override 
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
    if (prevVisibleItem != firstVisibleItem) { 
     if ((firstVisibleItem + visibleItemCount) == totalItemCount) { 

      Toast.makeText(getActivity(), R.string.please_wait_to_response_from_server, Toast.LENGTH_LONG).show(); 

      Thread thread = new Thread() { 
       @Override 
       public void run() { 
        getActivity().runOnUiThread(new Runnable() { 
         public void run() { 
          for (int i = (int) getLastID(); i <= getLastID() + 10; i++) { 
           String a = String.format("title %s", i); 
           String b = String.format("description %s", i); 
           Item item = new Item(a, b, String.valueOf(i)); 
           items.add(item); 
          } 
          adapter.notifyDataSetChanged(); 
         } 
        }); 
       } 
      }; 
     } 
    } 
} 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long thisID) { 
     super.onListItemClick(l, v, position, thisID); 
    } 
    public long getLastID() { 
     return Long.parseLong(items.get(items.size() - 1).getmLastID()); 
    } 
} 

ArrayAdapter:

public class ItemAdapter extends ArrayAdapter<Item> { 

    public ItemAdapter(Context c, List<Item> items) { 
     super(c,0,items); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ItemView itemView = (ItemView)convertView; 
     if (null == itemView) 
      itemView = ItemView.inflate(parent); 

     itemView.setItem(getItem(position)); 

     itemView.setBackgroundColor(((position % 2)!=0) ? Color.rgb(229, 229, 229) : Color.WHITE); 
     return itemView; 
    } 

} 

ответ

1
ArrayAdapter adapter = (ArrayAdapter)yourListView.getAdapter(); 

    ArrayList<Item> items = new ArrayList<Item>(); 
       for (int i= (int) getLastID(); i<= getLastID() + 10; i++){ 

      String a = String.format("title %s", i); 
      String b = String.format("description %s", i); 

        Item item = new Item(a , b , String.valueOf(i)); 
        items.add(item); 

       } 
     adapter.addAll(items); 
     adapter.notifyDataSetChanged(); 
+0

если ваш метод вызывается в конце списка, попробуйте этот код внутри вашего условия if внутри onScroll –

+0

post Обновлено. не разрешено – 2014-09-17 06:28:10

+0

он на Ui нить не нужно 'runOnUiThread' – mmlooloo

-1

загрузить ваш ListView с новыми строками, вы должны позвонить в setAdapter после списка изменений.

Вместо:

new ItemAdapter(getActivity(), items).notifyDataSetChanged(); 

Я хотел бы попробовать

my_listview.setAdapter(new ItemAdapter(getActivity(), items); //items must contains the old and the new items 

Или просто

setAdapter(new ItemAdapter(getActivity(), items); 

Как вы используете ListFragment. Возможно, вам также понадобится позвонить notifyDataSetChanged(), но я не совсем уверен

+0

нет необходимости создавать новый адаптер, каждый раз, удалять память и запускать GC снова и снова. – mmlooloo

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