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と、ログ情報にgetCount1 または 2 が表示されてもメソッドが呼び出されないことがありますgetViewが、呼び出されません。 . パターンはありません。つまり、5 回getView呼び出されて正常に機能し、突然機能しなくなります。

4

1 に答える 1

1

これは奇妙なチェックです:

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

私は言及しています:

totalItemCount % 6 == 0

そのため、アイテムの総数が常に 6 の倍数でない限り、このチェックはfriendsAdapter.setLoadingData(true,pageNo);呼び出されません。notifyDataSetChanged();そのため、内部にあるステートメントはsetLoadingData(boolean, int)いつでも実行されませんtotalItemCount % 6 != 0

編集

これが真になる状況も考えられません。

firstVisibleItem + visibleItemCount > totalItemCount

次のようにして、ユーザーがリストの最後に到達したかどうかを確認できます。

firstVisibleItem + visibleItemCount == totalItemCount
于 2013-09-26T01:59:25.373 に答える