`
mysfzj_web
  • 浏览: 14566 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

listview动态加载数据

 
阅读更多

 

 效果图

<1>

当前listview里的原始数据



 
<2>
当滑动到最低端时候,开始加载新数据,出现loading



 
<3>
新数据加载后显示


 

 

具体实现

写一个适配器,一般会自己继承,然后重新一些东西
 
public class MyAdapter extends ArrayAdapter<bean>{

      private final LayoutInflater mInflater;

    public MyAdapter(Context context, List<bean> apps) {
        super(context, 0, apps);
        mInflater = LayoutInflater.from(context);
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      bean bean = this.getItem(position);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item, parent, false);
        }
        TextView data = (TextView) convertView.findViewById(R.id.text);
        data.setText(bean.getName());
        return convertView;
    }
}



activity加载数据,新数据一般是当你第一次默认显示的数据已经完全显示,然后滚轮拖动到屏幕下端时候加载,也就是
firstVisibleItem + visibleItemCount = totalItemCount的时候,此时才启动线程开始加载数据。
 
public class LoadActivity extends Activity {
      private ListView lv = null;
      ArrayList<bean> beans = new ArrayList<bean>();
      MyAdapter adapter = null;
      boolean isRefresh = true;
      boolean isFirstRun = true;
      private bean bean=null;

      @Override
      public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.refresh);
            lv = (ListView) findViewById(R.id.listview);
            lv.setOnScrollListener(new OnScrollListener() {

                  public void onScroll(AbsListView view, int firstVisibleItem,
                              int visibleItemCount, int totalItemCount) {
                        Log.i("v", "" + visibleItemCount);
                        Log.i("f", "" + firstVisibleItem);
                        Log.i("t", "" + totalItemCount);
                         
                        //第一次进入时候,如果当前显示页面放不下第一次的所有数据,会分页显示
                        //就算滚轮到最低端,也不会加载的新的数据,只有当第一次数据显示完后才会刷新出现loading
                        //如果没有下面的判断,在你进入这个listview就会直接加载一次新数据,在这个例子里,比如你第一次加载的事40条数据,会变成45条
                        if (isFirstRun) {
                              isFirstRun = false;
                              return;
                        }
                        
                        if ((firstVisibleItem + visibleItemCount) == totalItemCount
                                    && isRefresh) {
                              isRefresh = false;
                             //loading条显示出来
                              findViewById(R.id.loadtext).setVisibility(View.VISIBLE);
                              new LoadThread().start();
                        }

                  }

                  public void onScrollStateChanged(AbsListView view, int scrollState) {
            });
            adapter = new MyAdapter(this.getBaseContext(), getFirstBean());
            lv.setAdapter(adapter);

      }
     //第一次加载的数据
      private ArrayList<bean> getFirstBean(){
            bean =new bean();
            for (int i = 0; i < 20; i++) {
                  bean = new bean();
                  bean.setName("Json   " + i + "  号");
                  beans.add(bean);
            }
            return beans;
      }     
      //需要加载的新数据
      private void refreshListView() {
            if (beans == null || adapter == null) {
                  return;
            }
            bean bean = null;
            for (int i = 0; i < 5; i++) {
                  bean = new bean();
                  bean.setName("新数据:  " + i);
                  beans.add(bean);
            }
      }

      Handler _handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                  switch (msg.what) {
                  case 1:
                        adapter.notifyDataSetChanged();
                        //当数据已经改变后loading条不显示出来
                        findViewById(R.id.loadtext).setVisibility(View.INVISIBLE);
                        isRefresh = true;
                        break;
                  case 2:
                  }
            }
      };
     
      class LoadThread extends Thread {

            @Override
            public void run() {
                  refreshListView();
                  try {
                        sleep(1000);
                  } catch (InterruptedException e) {
                        e.printStackTrace();
                  }
                    //传给handler处理
                  _handler.sendEmptyMessage(1);
            }
      }

}
  • 大小: 15.8 KB
  • 大小: 18.4 KB
  • 大小: 21 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics