2 mysign MySign 于 2016.09.10 11:27 提问

listview下拉刷新时遇到的问题

listview在第一页时往下拉,没到底部就会刷新,而第二页会拉到底部才会刷新,
到第三页时又会出现没到底部就会刷新了
package com.phone1000.exam01.activity;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.phone1000.exam01.R;
import com.phone1000.exam01.adapter.MyAdapter;
import com.phone1000.exam01.async.DownDataListAsyncTask;
import com.phone1000.exam01.bean.Data;
import com.phone1000.exam01.constant.IMyUrl;
import com.phone1000.exam01.interf.OnGetDownDataListListener;

public class MainActivity extends Activity implements OnGetDownDataListListener {
private ListView lvShow = null;
private TextView noData = null;
private int index = 1;
private boolean isBottom = false;
private MyAdapter adapter = null;
// 全局的数据列表
private List list = new ArrayList();

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


    new DownDataListAsyncTask(MainActivity.this)
            .execute(IMyUrl.url + index);

    initView(); 

    setListener();
}

private void setListener() {
    lvShow.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            /**
             * 如果isBottom为true并且手指离开屏幕, 开启新的异步任务,
             * 注意:开启异步任务以后要设置isBottom为false 否则,会一直每当
             */
            if (isBottom
                    && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                new DownDataListAsyncTask(MainActivity.this)
                        .execute(IMyUrl.url + ++index);
                isBottom = false;
            }

        }

        // 判断如果first+visible=total则滑到了屏幕底部,则设置isBottom为true;
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {

            if (firstVisibleItem + visibleItemCount == totalItemCount) {

// Toast.makeText(
// MainActivity.this,
// "first***" + firstVisibleItem + "visible***"
// + visibleItemCount + "total***"
// + totalItemCount, Toast.LENGTH_LONG).show();
isBottom = true;
}
}
});
}

private void initView() {

    lvShow = (ListView) findViewById(R.id.lvShow);
    noData = (TextView) findViewById(R.id.NoData);

    lvShow.setEmptyView(noData);

    adapter = new MyAdapter(this.list, MainActivity.this);
    /**
     * 在这里设置适配器是只设置了一个适配器,以后到底部刷新时是在此适配器里添加数据
     * 如果在回调方法里设置适配器,相当于每次调用回调方法都会给listview重新设置适配器
     * 所导致的结果就是每次刷新完,都显示第一页内容
     */
    lvShow.setAdapter(adapter);


}

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

@Override
public void onGetDownDataList(List<Data> list) {
    // 每次刷新后在全局的数据列表中添加新获取到的数据
    this.list.addAll(list);
    // 每次刷新都更新适配器中的数据
    adapter.notifyDataSetChanged();
    // *****************

// Toast.makeText(MainActivity.this, lvShow.getCount(), Toast.LENGTH_LONG).show();
}

}


3个回答

oSanYeCao1234567
oSanYeCao1234567   Ds   Rxr 2016.09.11 20:00
已采纳

关键是这句 view.getLastVisiblePosition() == (view.getCount() - 1) // 判断滚动到底部

MySign
MySign 可以了,谢谢咯!每一页都没问题了。可是我之前写的的为什么有问题呢?第一个出现问题还可以理解,第三个出现不知道为什么?
大约一年之前 回复
oSanYeCao1234567
oSanYeCao1234567   Ds   Rxr 2016.09.10 12:23

onScrollStateChanged 里面的判断滑没滑到底部的逻辑有问题,具体可以看下这篇博客 http://blog.csdn.net/fxtxz2/article/details/8538696
希望能够帮到你

MySign
MySign 回复汉代风云: 恩,不好意思这么久回复你;我不知道你代码里的isLastisNext是什么意思
一年多之前 回复
oSanYeCao1234567
oSanYeCao1234567 回复MySign: 看我下面给的回答
一年多之前 回复
MySign
MySign 回复汉代风云: 哎呦,,,不对啊,加了判断只是解决了第一页,以后的还有问题。
一年多之前 回复
oSanYeCao1234567
oSanYeCao1234567 回复MySign: 问题解决啦就好哈
一年多之前 回复
MySign
MySign 我在 public void onScroll方法里的判断加了一层if(totalitemcount!=0&&firstvisibleitem+visibleitemcount==totalitemcount)解决问题了。但是,多加的判断可以解决第一次未拖到底就刷新我还可以理解,但是这个多加的判断把第三个页面时未拖到底的问题也解决了,我不能理解。
一年多之前 回复
oSanYeCao1234567
oSanYeCao1234567   Ds   Rxr 2016.09.10 18:05

那你先根据我的建议,这是尝试下:

public void onScrollStateChanged(AbsListView view, int scrollState) {

    switch (scrollState) {

        // 当不滚动时

        case OnScrollListener.SCROLL_STATE_IDLE:

            // 判断滚动到底部

            if (view.getLastVisiblePosition() == (view.getCount() - 1)) {

                isLastisNext++;

          }

          break;

    }

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!