1 常用属性
1.1 设置按下时背景透明
android:listSelector="@android:color/transparent"
1.2 取消滚动条
android:scrollbars="none"
1.3 ListView中分割线的设置
1.3.1 设置分割线
(1) 在布局文件中ListView元素中通过属性设置
android:divider="#fffff" 分割线颜色
android:dividerHeight="10px" 分割线高度
(2) 使用XML文件设置
<!-- res/drawable/liner.xml ->
<?xmlversionxmlversion="1.0"encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<gradient
android:startColor="#000000"
android:centerColor="#CCCCCC"
android:endColor="#FFFFFF"
android:height="1px"
android:angle="0"/>
</shape>
</item>
</layer-list>
1.3.2 取消分割线
android:divider="@null" //最常用方法
android:divider="#00000000"
lv.setDividerHeight(0) //高度设为0
1.4 设置ListView需要显示在第几项
listView.setSelection(N);//N是需要显示的第N个Item
//使用以下代码实现平滑移动
listview.smoothScrollBy(moveInstance, duration);
listview.smoothScrollByOffset(offset);//滚动offset个item
listview.smoothScrollToPosition(index);//跳转到index位置
1.5 遍历ListView中的所有Item
for(int i = 0; listView.getChildCount(); i++) {
View view = listView.getChildAt(i);
}
1.6 隐藏Listview和RecyclerView去掉滚动条和滑动到边界阴影
(1)设置滑动到顶部和底部的背景或颜色:
android:overScrollFooter="@android:color/transparent"
android:overScrollHeader="@android:color/transparent"
(2)设置滑动到边缘时无效果模式:
android:overScrollMode="never"
(3)以下是整体设置(overScrollHeader和overScrollFooter可不写,此处写了是引用的透明色)
<ListView
android:id="@+id/lv_type"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollFooter="@android:color/transparent"
android:overScrollHeader="@android:color/transparent"
android:overScrollMode="never"
android:scrollbars="none">
(4)RecyclerView的属性设置
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_search_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:scrollbars="none" />
2 处理ListView为空的情况
ListView和其他继承自AdapterView的类可以使用setEmptyView(View view)方法设置空状态下的显示。当绘制AdapterView的适配器为空或者isEmpty
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/empty_listview_lv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/empty_imageview_iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/bg"
android:visibility="gone"/>
</FrameLayout>
在ListView下显示一个ImageView,注意我在测试的时候发现ImageView一定设置Android:visibility=”gone”否则不管ListView的适配器是否为空都会显示。
public class EmptyListViewActivity extends Activity {
private ListView empty_listview_lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.empty_listview_layout);
empty_listview_lv = (ListView) findViewById(R.id.empty_listview_lv);
String[] mListStr = {"1","2","3","3","4"};
empty_listview_lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, mListStr));
empty_listview_lv.setEmptyView(findViewById(R.id.empty_imageview_iv));
}
}
这样当我们的数据为空的时候可以设置
empty_listview_lv.setAdapter(null);
这样就会显示ImageView(注:不需要把ImageView的visibility设置为可见);
3 怎么判断listview滚动条是滚动到顶部还是底部
/**
* 上拉刷新
*/
private ItemListView.OnScrollListener onScrollListener = new ItemListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
itemListView.setCurrentPosition(view.getFirstVisiblePosition());
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastVisibleItemPosition = view.getLastVisiblePosition();
//触发到底部
if (lastVisibleItemPosition + 1 == totalItemCount) {
}
}
};
/**
* OnScrollListener 监听
*/
lv.setOnScrollListener(new OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
// 当不滚动时
case OnScrollListener.SCROLL_STATE_IDLE:
// 判断滚动到底部
if (lv.getLastVisiblePosition() == (lv.getCount() - 1)) {
}
// 判断滚动到顶部
if(lv.getFirstVisiblePosition() == 0{
}
break;
//滚动状态
case OnScrollListener.SCROLL_STATE_FLING:
break;
//触摸后滚动
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
break;
}
}
/**
* 正在滚动
* firstVisibleItem第一个Item的位置
* visibleItemCount 可见的Item的数量
* totalItemCount item的总数
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
}
});
/**
* OnTouchListener 监听
*/
listView.setOnTouchListener(new View.OnTouchListener()) {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
//接触到ListView移动时
break;
case MotionEvent.ACTION_UP:
//离开ListView时
break;
case MotionEvent.ACTION_DOWN:
//接触到ListView时
break;
}
return false;
}
});
4 ScrollView嵌套ListView滑动冲突,与显示不全解决方法
/**
* 重写ListView
* @author guan
* 2016-3-30
*/
public class UserListView extends ListView {
public UserListView(Context context) {
super(context);
}
public UserListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public UserListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
参考博客:四种方案解决ScrollView嵌套ListView问题
5 如何解决ListView整个Item点击和Item中某个按钮的点击-两个办法
5.1 在Item的xml文件根布局中添加属性
Android:descendantFocusability="blocksDescendants"
5.2 设置item里面按钮控件的属性
android:clickable="true"
android:focusable="false"