2

전에는 그런 것을 본 적이 없지만 지난 며칠 동안 나는 Listview의 매우 독특한 동작을 경험하고 있으며 지금까지는 문제를 격리 할 수 ​​없었습니다.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)) 

내가 말하는거다 : 항목의 총 수는 항상 6의 배수하지 않는 한

totalItemCount % 6 == 0 

그래서,이 검사는 friendsAdapter.setLoadingData(true,pageNo);을 방지 할 수 있습니다 불리는 것에서. 그렇기 때문에 notifyDataSetChanged(); 문이 setLoadingData(boolean, int) 안에있는 이유는 totalItemCount % 6 != 0 일 때마다 실행되지 않습니다.

편집 : 사용자가 목록의 마지막에 도달하면

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 항목)로 애플리케이션을 실행하십시오. Log 문은 20 개 항목으로 출력되지 않습니다. 왜이 수표를 발행하는지 물어봐도 될까요? – Vikram

+0

'setLoadingdata (boolean, int)'참조는 서버가'page' 당 6 개의 아이템을 제공하기 때문에 6 개 이상의 아이템이있을 때만 실행됩니다. – mjosh