概述

这是读书笔记的第二篇,主要的内容就是关于ListView展开的,ListView是我们开发中用的比较多的一个控件,所以很有必要好好研究一下。

笔记

给ListView设置空视图
当ListView中没有数据时,我们可以显示一个空的视图

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.androidheros.MainActivity">

<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/empty_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher"
/>
</FrameLayout>
listView = (ListView) findViewById(R.id.listview);
listView.setEmptyView(findViewById(R.id.empty_view));

Android群英传读书笔记第四章 (ListView使用技巧)_android

List状态监听

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
private int lastVisiblePosition = listView.getLastVisiblePosition();
@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://抛出
break;
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//出现最后一个条目
if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){
}
//到第一个条目
if(firstVisibleItem == 0){
}
if(firstVisibleItem> lastVisiblePosition){
System.out.println("==========下滑");
}else if(firstVisibleItem< lastVisiblePosition){
System.out.println("==========上滑");
}
lastVisiblePosition = firstVisibleItem;
}
});
}
}

让ListView弹性滑动

默认情况下,ListView滑动到最顶部值不能继续向下滑的,我们可以重写一个方法来实现弹性滑动。

Android群英传读书笔记第四章 (ListView使用技巧)_android_02

@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, 100, isTouchEvent);
}

这里我们指定maxOverScrollY为100。具体应用时我们可以根据屏幕的密度计算滑动的距离。

自动显示与隐藏布局的ListView
注意:
添加headerview要在设置adapter之前
获取被认为是滑动的最小距离

scaledTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();

onTouch事件中一般返回false,因为我们要让onTouchEvent处理事件

如何获取ActionBar的高度

/**
* 设置头布局,注意:这个头布局的高度要和ToolBar的高度一致
*/
public void initHeadView(){
View view = new View(this);
AbsListView.LayoutParams params = new AbsListView.LayoutParams
(AbsListView.LayoutParams.MATCH_PARENT,
(int)getResources().getDimension(R.dimen.abc_action_bar_default_height_material));
view.setLayoutParams(params);
listView.addHeaderView(view);
}

不同布局的ListView
重写两个方法

/**
* 返回position个item的类型
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}

/**
* 总共有多少中类型
* @return
*/
@Override
public int getViewTypeCount() {
return super.getViewTypeCount();
}

最后我们在getView方法中去判断,做不同的处理,比如填充不同的布局

public View getView(int position, View convertView, ViewGroup parent) {
if(getItemViewType(position)==0){

}else{

}
......
}

动态改变ListView布局

Android群英传读书笔记第四章 (ListView使用技巧)_弹性滑动_03

public class MainActivity extends AppCompatActivity {

private ListView listView;
String[] datas = {"A","B","C","D","E","F","G","H","I","J",
"K","L","M","N","O"};
private List<String> mDatas;
private MyAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listview);
mDatas = Arrays.asList(datas);
adapter = new MyAdapter(mDatas, this);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapter.setCurrentItem(position);
adapter.notifyDataSetChanged();
}
});
}
class MyAdapter extends BaseAdapter{
private List<String> datas;
private Context mContext;
private int mCurrentPosition;
public MyAdapter(List<String> datas,Context context){
this.datas = datas;
mContext = context;
}
@Override
public int getCount() {
return datas.size();
}

@Override
public Object getItem(int position) {
return datas.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout layout = new LinearLayout(mContext);
layout.setOrientation(LinearLayout.VERTICAL);
if(mCurrentPosition == position){
layout.addView(addFocusView(position));
}else{
layout.addView(addNormalView(position));
}
return layout;
}
public void setCurrentItem(int position){
mCurrentPosition = position;
}
}
public View addNormalView(int position){
LinearLayout layout = new LinearLayout(this);
layout.setGravity(Gravity.CENTER_VERTICAL);
layout.setOrientation(LinearLayout.HORIZONTAL);
ImageView imageView = new ImageView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
imageView.setImageResource(R.mipmap.ic_launcher);
layout.addView(imageView,params);
TextView textView = new TextView(this);
textView.setText(mDatas.get(position));
LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams
(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layout.addView(textView,params2);
return layout;
}
public View addFocusView(int position){
ImageView imageView = new ImageView(this);
imageView.setImageResource(R.mipmap.ic_launcher);
return imageView;
}
}