2015-07-03 79 views
1

我在Java新和我念叨列表视图,所以 如果我是正确的,它会消耗如果一个ListView有上千项的设备的内存中,以便避免我应该创建一个滚动监听器每次x项目已经被加载时,会加载更多的itens。对?无尽的滚动监听

我发现这个代码,我试图使用它,但在主要活动当我尝试实现它,并设置onLoadMOre,我不知道该怎么办。

public abstract class EndlessScrollListener implements AbsListView.OnScrollListener { 
    // The minimum amount of items to have below your current scroll position 
    // before loading more. 
    private int visibleThreshold = 5; 
    // The current offset index of data you have loaded 
    private int currentPage = 0; 
    // The total number of items in the dataset after the last load 
    private int previousTotalItemCount = 0; 
    // True if we are still waiting for the last set of data to load. 
    private boolean loading = true; 
    // Sets the starting page index 
    private int startingPageIndex = 0; 

    public EndlessScrollListener() { 
    } 

    public EndlessScrollListener(int visibleThreshold) { 
     this.visibleThreshold = visibleThreshold; 
    } 

    public EndlessScrollListener(int visibleThreshold, int startPage) { 
     this.visibleThreshold = visibleThreshold; 
     this.startingPageIndex = startPage; 
     this.currentPage = startPage; 
    } 

    // This happens many times a second during a scroll, so be wary of the code you place here. 
    // We are given a few useful parameters to help us work out if we need to load some more data, 
    // but first we check if we are waiting for the previous load to finish. 
    @Override 
    public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount) 
    { 
     // If the total item count is zero and the previous isn't, assume the 
     // list is invalidated and should be reset back to initial state 
     if (totalItemCount < previousTotalItemCount) { 
      this.currentPage = this.startingPageIndex; 
      this.previousTotalItemCount = totalItemCount; 
      if (totalItemCount == 0) { this.loading = true; } 
     } 
     // If it’s still loading, we check to see if the dataset count has 
     // changed, if so we conclude it has finished loading and update the current page 
     // number and total item count. 
     if (loading && (totalItemCount > previousTotalItemCount)) { 
      loading = false; 
      previousTotalItemCount = totalItemCount; 
      currentPage++; 
     } 

     // If it isn’t currently loading, we check to see if we have breached 
     // the visibleThreshold and need to reload more data. 
     // If we do need to reload some more data, we execute onLoadMore to fetch the data. 
     if (!loading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + visibleThreshold)) { 
      onLoadMore(currentPage + 1, totalItemCount); 
      loading = true; 
     } 
    } 

    // Defines the process for actually loading more data based on page 
    public abstract void onLoadMore(int page, int totalItemsCount); 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     // Don't take any action on changed 
    } 
} 

mycode的:

public class MainActivity extends ActionBarActivity implements EndlessScrollListener{ 

    List<Paises> paisesList = new ArrayList<Paises>(); 
    EditText j_search; 

    ListView j_listview; 

    String[] j_paises; 
    String[] j_nota; 

    PaisesAdapter j_adapter; 


    int[] j_flags = 
      { 
        R.drawable.flag_brazil, 
        R.drawable.flag_bolivia, 
        R.drawable.flag_argentina, 
        R.drawable.flag_chile, 
        R.drawable.flag_colombia, 
        R.drawable.flag_equador, 
        R.drawable.flag_france, 
        R.drawable.flag_guyana, 
        R.drawable.flag_paraguay, 
        R.drawable.flag_peru, 
        R.drawable.flag_suriname, 
        R.drawable.flag_uruguay, 
        R.drawable.flag_venezuela 

      }; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 



     j_paises = getResources().getStringArray(R.array.r_arrayPais); 
     j_nota = getResources().getStringArray(R.array.r_arrayNota); 

     j_listview = (ListView)findViewById(R.id.l_lView); 
     j_search = (EditText)findViewById(R.id.l_searchView); 

     j_adapter = new PaisesAdapter(this, paisesList); 


     j_adapter.notifyDataSetChanged(); 
     j_listview.setAdapter(j_adapter); 
     j_listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); 


     int i = 0; 
     for(String paises : j_paises) 
     { 
      Paises dataProvider = new Paises(j_flags[i], paises, j_nota[i]); 
      j_adapter.add(dataProvider); 
      i++; 
     } 

     Collections.sort(paisesList, new AbcComparator()); 

     j_listview.setTextFilterEnabled(true); 
     j_search.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       System.out.println("Text ["+s+"]"); 
       j_adapter.getFilter().filter(s.toString()); 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onLoadMore(int page, int totalItemsCount) { 

    } 


} 
+0

你不知道'onLoadMore'应该做什么? – calvinfly

+0

是的,我不知道我应该怎么做。 –

+0

'onLoadMore'你应该得到一个新的数据集,并把它插入适配器,并调用'Adapter.notifyDataSetChanged'刷新数据。你找到它的示例代码? – calvinfly

回答

0

在您需要处理存储在适配器项目这样的情况。 适配器是处理模型列表(项目,数据)的适配器。

所以假设,如果你的适配器

  • 延伸ArrayAdapter
  • 有一个getter/setter方法来更新其项目MyAdapter.getItems()/setItems(List<Item> newItems)
  • 的服务,您可以选择使用您的适配器或引用列表视图,然后

    @Override 
    public void onLoadMore(int page, int totalItemsCount) { 
        // download or fetch next page(s) items, then add them to your adapter list 
        List<Item> newPageOfItems = .....; 
    
        // if list view reference, cast and get a reference to your adapter 
        MyAadapter myAdapter = (MyAdapter) listView.getAdapter(); 
    
        if (newPageOfItems != null && !newPageOfItems.isEmpty()) { 
         List<Item> currentItems = myAdapter.getItems(); 
         currentItems.addAll(newPageOfItems); 
         currentItems.setItems(currentItems); 
         // if for some reason new page is not updated properly, uncomment below 
         // myAdapter.notifyDataSetChanged(); 
        } 
    }