您的位置:首页 > 移动开发 > Android开发

Android ListView 使用相关技巧

2016-04-20 18:23 597 查看
1.使用ViewHolder来提高效率:避免每次调用getView()的时候通过findViewById()实例化控件(在自定义的Adapter中定义一个内部类ViewHolder)

2.设置item的间隔:系统提供了

android:divider="@android:color/darker_gray"
android:dividerHeight="10dp"


提示:不仅仅设置颜色,还可以设置图片哦,当设置为这样时没有间隔线


android:divider="@null"


3.隐藏listview滚动条

android:scrollbars="none"


4.item点击效果

android:listSelector="@android:color/transparent"


5.显示在第N个item

listView.setSelection(n);


6.处理空的listView(即当listview相关的Data集合或数组没有数据时,也是Adapter中的getCount()返回0时)

listView.setEmptyView(findViewById(R.id.textView));


7.滑动监听

7.1通过onTouchListener

listView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
mFirstY = motionEvent.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurrentY = motionEvent.getY();
if(mCurrentY - mFirstY > mTouchSlop){
//down
}else if(mFirstY - mCurrentY > mTouchSlop){
//up
}
break;
}
return false;
}
});


提示:mTouchSlop是定义的系统认为最低的滑动距离


mTouchSlop = ViewConfiguration.get(this).getScaledPagingTouchSlop();


7.2通过OnScrollListener


listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {

}

@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount >0){
Log.e("TAG", "到最后一行");
}
if(firstVisibleItem > lastVisibleItemPosition){
Log.e("TAG", "向上滑动");//show
}else if(firstVisibleItem < lastVisibleItemPosition){
Log.e("TAG", "向下滑动");//hide;
}
lastVisibleItemPosition = firstVisibleItem;//lastVisibleItemPosition是成员变量(用于记录)
}
});


8.弹性的listview:(修改一个参数即可)

自定义listview并重写 overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent)方法

@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, elasticDistance, isTouchEvent);
}


提示:修改的就是其中的maxOverScrollY --> elasticDistance参数,


为了能满足多分辨率

private void init(Context context) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
float density = metrics.density;
elasticDistance = (int)(elasticDistance * density);//elasticDistance = 500(可自定义数值)
}


tip:不要忘记在自定义的listview的构造器中调用init(Context context)哦


9.分类型的listview(例如:QQ微信,聊天布局的实现)



其实就主要用两个方法在自定义的Adapter中

@Override
public int getItemViewType(int position) {
int x =0;
if(position%2 == 0){
x = 0;
}else{
x =1;
}
return x;
}

@Override
public int getViewTypeCount() {
return 2;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(getItemViewType(i) == 1){
view = LayoutInflater.from(Main2Activity.this).inflate(R.layout.in,null);
}else{
view = LayoutInflater.from(Main2Activity.this).inflate(R.layout.out,null);
}
return view;
}


tip:getItemViewType()用来返回第position个item是什么类型
getViewTypeCount()用来返回类型的总数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview