- ListView常用技巧
- ListView常用拓展
4.1.1使用ViewHolder模式提高效率
4.1.2设置项目间分割线
android:divider="@android:color/darker_gray"
android:dividerHeight="5dp"
4.1.3隐藏ListView的滚动条
android:scrollbars="none"
package wangsheng.swpuiot.qunyingzhuan.ch4.section1;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
import wangsheng.swpuiot.qunyingzhuan.R;
public class ViewHoulderAdapter extends BaseAdapter {
private List<String> mData;
private LayoutInflater mInflater;
public ViewHoulderAdapter(Context con, List<String> mData) {
this.mData = mData;
this.mInflater = LayoutInflater.from(con);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHoulder viewHoulder = null;
//判断是否缓存
if (convertView == null) {
viewHoulder = new ViewHoulder();
convertView = mInflater.inflate(R.layout.viewholder, null);
viewHoulder.img = convertView.findViewById(R.id.imageView);
viewHoulder.title = convertView.findViewById(R.id.textView);
convertView.setTag(viewHoulder);
} else {
viewHoulder = (ViewHoulder) convertView.getTag();
}
viewHoulder.img.setBackgroundResource(R.drawable.ic_launcher_background);
viewHoulder.title.setText(mData.get(position));
return convertView;
}
public final class ViewHoulder {
public ImageView img;
public TextView title;
}
}
效果图
4.1.4取消ListView的item的点击效果
android:listSelecter = "#000000000"
或者Android自带的透明色
android:listSelecter = "@android:color/transparent"
设置ListView需要显示在第几项
listView.setselection(N)
上面的方法类似于scrollTo是瞬间移动都得。下面是平滑移动
mListView.smoothScrollBy(distance,duration);
mListView.smoothScrollByOffset(offset);
mListView.smoothScrollToPosition(index);
动态修改ListView
mData.add("new");
mAdapter.notifyDataSetChanged();
遍历ListView中所有item
for(int i = 0;i<mListView.getChildCount();i++){
View view = mListView.getChildAt(i);
}
处理空ListView
ListView无数据时候,给以无数据提示
ListView listView = findViewById(R.id.listView);
listView.setEmptyView(findViewById(R.id.empty_view));
空数据显示默认视图,有数据不会显示
ListView滑动监听
mListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
}
return false;
}
});
可以通过这三个事件发生时的坐标,根据坐标判断用户滑动的方向,并在不同的事件中做出不同的处理。
OnScrollerListener
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
//停止滑动时
break;
case SCROLL_STATE_TOUCH_SCROLL:
//正在滚动
break;
case SCROLL_STATE_FLING:
//手指抛动时,即手指用力滑动
//在离开后ListView由于惯性继续滑动的状态
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//滚动时一直调用
}
});
当用户没有做手指抛动的状态时候OnScrollerListener方法只会回调两次,一次停止,一次正在滚动,否则3次加上手指抛动。
onScroll()这个回调方法,它在ListView滚动时会一直回调,而方法中的后三个int参数,非长精确地显示了滚动的状态
- firstVisibleItem :当前能看见的第一个Item的ID(从0开始)(包括没有完整显示的)
- visibleItemCount:当前能看见的Item总数
- totalItemCount:整个ListView的Item总数
判断是否滚动到了最后一行
if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){
//当前满足已滚动到了最后一行
}
判断滚动的方向
if(firstVisibleItem>lastVisibleItemPosition){
//上滑
}else if(firstVisibleItem<lastVisibleItemPosition){
下滑
}
lastVisibleItem = firstVisibleItem;
通过一个成员变量lastVisibleItem来记录上一次第一个可视的Item的ID并与当前的可视Item的ID进行比较,可知滚动方向。
ListView已经封装的一些方法
//获取可视区域内最后一个Item的id
mListView.getLastVisiblePosition()
//获取可视区域内第一个Item的id
mListView.getFirstVisiblePosition()
4.2ListView常用拓展
具有弹性的ListView
通过自写ListView继承原生ListView重写overScrollBy方法,修改传入的maxOverScrollY参数,这个参数默认是0,就没有弹性,可以传入我们自己定量的值,就可以让ListView具有弹性。
这种方法不如增加HeaderView或者使用ScrollerView进行嵌套的可定制性高。
自动显示隐藏布局的ListView
给ListView增加一个HeaderView
聊天的ListView
就是根据ListView的item的不同加载不同的布局就行了
ListView有个 getItemViewType()方法。
动态地改变ListView的布局
通过记录点击的item的位置,在getView的方法中判断position是否为点击的item的位置,加载不同的布局。