2013-04-06 59 views
2

我想用Commonsware無盡適配器(https://github.com/commonsguy/cwac-endless)做一個無限的列表視圖,默認情況下工作正常。反轉的無盡列表視圖

我想要做的是一個基本的聊天應用程序。 新項目應該出現在最後,當用戶滾動到頂部時,聊天記錄應該可以通過無限適配器加載。

這本身並不難做到。如果ArrayAdapter包含數據s.t.最新的項目在位置0,然後在ListView的XML聲明中簡單地使用android:stackFromBottom將把列表的開頭放在最後。

爲確保「加載更多」指示符位於頂部,我將覆蓋getItem,getView等,以提供反向位置(count-1-position)。

我的問題:當EndlessAdapter在列表的末尾添加新的數據,「加載更多」指示燈仍然可見,導致其無休止地獲取更多數據,直到沒有更多的獲取。 預計它將加載一個批次,然後用戶需要向下滾動(此處:向上)以加載更多元素。

我錯過了什麼?

回答

1

就我個人而言,我會考慮拉到刷新這種情況下,而不是EndlessAdapter

這就是說,如果您看到出現額外的行,但掛起的視圖仍然存在,那麼您修改的getView()工作不正常。出現的附加行表明notifyDataSetChanged()本身正在運行(否則,這些行將不會顯示)。所以,如果掛起的視圖仍然顯示,那麼getView()大概是返回掛起的視圖(位置0,我猜)。事實上,我不知道如何獲得反向EndlessAdapter的工作方式,因爲第一行應始終是掛起的視圖,應始終加載數據,直到數據用完(並且在聊天的情況下,這可能永遠不會是這樣)。

因此,我再次使用拉到刷新,或者您將不得不切換到注意滾動事件的不同「無盡」方案,而不是等待待定視圖被顯示,作爲獲取更多數據的觸發器。

+0

謝謝您的回答。我會嘗試「拉刷新」模式(當然有不同的標籤))。 加載後我也嘗試過「smooothScrolls」以將待定視圖移出可見範圍,但這種方法也不成功。 – Patrick 2013-04-06 15:20:04

0

不關心notifyDataSetChanged()的幫助。 我實現了一個適配器來返回Integer.MAX_VALUE作爲元素的數量,特別是計算緩存中的索引。

下面是一些片段:

<ListView 
     android:id="@+id/logContainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:stackFromBottom="true" /> 

...... 

    logContainer.setOnScrollListener(new OnScrollListener() { 
     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

      if ((logAdapter.getCachedCount() - (Integer.MAX_VALUE - firstVisibleItem)) <= LINES_TO_TRIGGER_PRELOAD && !logAdapter.isPreloading()) { 
       logAdapter.preloadAtBackground(); 
      } 
     } 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) {} 
    }); 



class LogAdapter extends BaseAdapter { 

    private ArrayList<String> logList = new ArrayList<String>(); 

    @Override 
    public int getCount() { 
     return Integer.MAX_VALUE; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     TextView logLineView = new TextView(LogViewDialog.this); 
     int idx = logList.size() - (Integer.MAX_VALUE - position); 
     logLineView.setText(logList.get(idx)); 
     return logLineView; 
    } 

    .........