MySign 2016-09-10 03:27 采纳率: 25%
浏览 1081
已采纳

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条回答

  • RoidCoder 2016-09-11 12:00
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样