Android基础UI之ListView注意点

时间:2021-09-02 01:18:19

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"

Android基础UI之ListView注意点

5.2 设置item里面按钮控件的属性

android:clickable="true"
android:focusable="false"

Android基础UI之ListView注意点