Android-如何使listview的滑动更加平缓,为什么我的list滚动这么卡呢?

Android-如何使listview的滑动更加平缓,为什么我的list滚动这么卡呢?

瑾兮 发布于 2017-04-06 字数 509 浏览 1257 回复 4

如何使listview的滑动更加平缓,为什么我的list滚动这么卡呢?
我的代码如下:

public View getView(int position, View rowView, ViewGroup parent) {
View rowView = mInflater.inflate(R.layout.list_child_footer, null); rowView.findViewById(R.id.footer_progress).setVisibility(View.VISIBLE);
((TextView)rowView.findViewById(R.id.footer_main_text)).setText("Loading...");
rowView.setId(R.layout.list_child_footer);
return rowView;
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

虐人心 2017-09-17 4 楼

listview在getview时不用每次都去生成一个view,当向后滚动时,后面的view就会复用前面的view,代码如下:

 public View getView(int position, View rowView, ViewGroup parent) {
if (rowView == null) {
rowView = mInflater.inflate(R.layout.list_child_footer, null);
rowView.findViewById(R.id.footer_progress).setVisibility(View.VISIBLE);
((TextView) rowView.findViewById(R.id.footer_main_text)).setText("Loading...");
rowView.setId(R.layout.list_child_footer);
}
return rowView;
}

泛泛之交 2017-06-24 3 楼

如果adapter中的数据量很大的时候,在加载listview时会出现卡顿的现象。最好的解决办法就是先加载一定数量的数据,然后在最下方提示正在加载!
动态加载就是把放入adapter中的数据分好几次加载。在用户拖动listview时再加载一定的数据。
给listview添加OnScrollListener监听事件默认会覆盖下面两个方法:

OnScrollListener loadListener=new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
lastItem = firstVisibleItem + visibleItemCount;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//listview滚动时会执行这个方法,这儿调用加载数据的方法。
<coding-3 lang="other">
adapter.notifyDataSetChanged();//提醒adapter更新
uList.setSelection(lastItem - 1);//设置listview的当前位置,如果不设置每次加载完后都会返回到list的第一项。
}
}
};

1、如果activity中只有listview,当listview的数据量很大时,在启动activity时会卡顿半天知道数据加载完可以显示,这时可以可以用handler,将加载数据的操作写在handler里面,而且要在onResume()方法中执行,放在onCreate()不起作用。
2、如果是从网络获取数据,或者数据量很大可以新开一个线程,在线程中完成数据的加载。
3、如果添加的加载提示框出不来,可能是加载过程一直占有cpu,无法显示提示框,可以将加载的代码写到handler里面,用postDelayed()方法给一定的时间延迟去加载数据。
另外推荐你一篇文章,希望对你有帮助:ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)

瑾兮 2017-05-02 2 楼

用ViewHolder是很大程度解决卡的现象,但是如果ListView需要显示多种布局,或者显示一种比较复杂的布局,可以考虑用到getItemViewType()显示多种布局和布局拆分显示

参考一下:Listview getItemViewType的使用

浮生未歇 2017-04-15 1 楼

没有判断rowView是否为空,listview不用每次调用getview的时候都重新创建一个view.它内部有个缓冲机制。用来缓存之前创建或者用过的rowview。用自定义的viewholder类保存rowview的
子view,修改如下:

public class ViewHolder {
public TextView tv = null;
public progressBar pb= null;
//再加其他子view

}
ViewHolder holder = null;
if(null == rowView){
vh = new ViewHolder;
rowView = mInflater.inflate(R.layout.list_child_footer, null);
vh.tv = rowView.findViewById(R.id.footer_main_text);
vh.pb = rowView.findViewById(R.id.footer_progress);
rowview.setTag(vh)
}else{
holder = rowView.getTag();
}
vh.pb.setVisibility(View.VISIBLE);
vh.tv.setText("Loading...");

return rowView;