您的位置:首页 > 产品设计 > UI/UE

Android基础UI之ListView注意点

2016-03-08 23:51 621 查看

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"


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android