2013-09-22 51 views
2

我從來沒有見過類似的東西,但從過去幾天我正在經歷Listview非常奇特的行爲,直到現在我無法孤立的問題。非常奇怪的行爲的列表視圖

我只粘貼我認爲有必要的代碼,稍後我會告訴你我的問題。

/* tell adapter that data is done and stop the more loading progress bar*/ 
public void setDataChanged(boolean type) 
{ 
    isLoadingData = false; 
    notifyDataSetChanged(); 
} 

/* If loading is going on size of the adapter will increase to show the additional progress bar*/ 
@Override 
public int getCount() { 
    int size = friendsModels.size(); 
    if (isLoadingData) { 
     size += 1; 
    } 
    Log.i("size", String.valueOf(size));//to check size 

    return size; 
} 
/* set loading true and page number of the data items*/ 
public void setLoadingData(boolean isLoadingData, int page) { 
    this.isLoadingData = isLoadingData; 
    this.page = page; 
    notifyDataSetChanged(); 
} 

/* MAX_ITEM number of item returning from rest webservice per page*/ 
@Override 
public int getItemViewType(int position) { 
    if(isLoadingData && position%MAX_ITEM==0 && position>0) 
    { 
     if(position/MAX_ITEM==page+1) 
     return 1; 
    } 
    return 0; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    Log.e("getView", "getView"); 

    EventHolder eventHolder; 
    int type = getItemViewType(position); 
    LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if(convertView==null){ 
     eventHolder = new EventHolder(); 
     if(type==0) 
     { 
      convertView = li.inflate(R.layout.friends_list_items, parent,false); 

      eventHolder.name = (TextView)convertView.findViewById(R.id.textview_friend_name); 

      convertView.setTag(eventHolder); 

     } 
     else if(type==1) 
     { 
      convertView = li.inflate(R.layout.progress_dialog, parent,false); 
      eventHolder.progress = (RelativeLayout)convertView.findViewById(R.id.progress_layout); 
      convertView.setTag(eventHolder); 
     } 
    } 
    else 
    { 
     eventHolder = (EventHolder) convertView.getTag(); 
     if(type==0) 
     { 
      setFriends(eventHolder, position); 
     } 
    } 

    return convertView; 
} 

現在onScroll方法 -

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, 
     int visibleItemCount, int totalItemCount) { 
    if(firstVisibleItem + visibleItemCount >= totalItemCount && !loading && totalItemCount%6==0 && totalItemCount>0 && NetworkUtil.isNetworkAvailable(activity)) 
    { 
     loading = true; 
     friendsAdapter.setLoadingData(true,pageNo); 
     ControllerRequests.getPeople(FragmentClass.this, ++pageNo, search.getText().toString()); 
    } 
} 

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

雖然當有喜歡的5名或更多的項目,但由於項目規模減小比方說1或2,則有時getView方法沒有一切正常打電話雖然日誌信息顯示我getCount = 1或2但getView只是不會被調用。有沒有模式,我的意思是有時5次getView得到稱它工作正常,然後突然不是和那樣。

+0

如果getView沒有被調用,那麼你不應該在屏幕上看到任何內容。問題:1或2個項目是否佔用整個屏幕(或更多)或內容是否安裝在屏幕的可見部分內? – 66CLSjY

+0

準確地說,我沒有看到屏幕上的任何內容,只是空白。屏幕的可見部分提交6個項目,1或2個項目僅佔據屏幕的一部分。 – mjosh

回答

1

這是一個奇怪的檢查:

if(firstVisibleItem + visibleItemCount >= totalItemCount && !loading && 
       totalItemCount%6==0 && totalItemCount>0 && 
            NetworkUtil.isNetworkAvailable(activity)) 

我指的是:

totalItemCount % 6 == 0 

因此,除非項目總數將永遠是6的倍數,這個檢查將阻止friendsAdapter.setLoadingData(true,pageNo);從被叫。這就是爲什麼只要totalItemCount % 6 != 0時,setLoadingData(boolean, int)內的語句notifyDataSetChanged();就不會執行。

編輯:如果用戶已經達到了列表的末尾

firstVisibleItem + visibleItemCount > totalItemCount 

您可以用下面檢查去:

我也想不出的情況下,這將是真實的:

firstVisibleItem + visibleItemCount == totalItemCount 
+0

我一定會嘗試,但事情是我沒有任何問題,當項目是6或更多,問題發生時,只有讓說1或2項。所以'setLoadingData(boolean,int)'在這種情況下不會被調用。 – mjosh

+1

@mjosh'setLoadingdata(boolean,int)'不會被調用,除非您的適配器持有:0,6,12,18 ...項。在任何其他值上,'if check'將不會通過。當您的物品超過6個時,問題仍然存在。嘗試在if塊中添加此語句Log.d(「IF_CHECK」,「if check passed」)'。用一些不同的測試用例運行你的應用程序:1項,6項,20項,24項。您會注意到,即使有20個項目,Log語句也不會輸出。我可以問你爲什麼執行這項檢查? – Vikram

+0

查看'setLoadingdata(boolean,int)'只有當有多於6個項目時纔會被執行,因爲服務器每頁給出6個項目。 – mjosh