1. 使用ViewHolder模式提高效率
- 定義一個內(nèi)部類ViewHolder
- 在getView()方法中通過視圖緩存機制來重用緩存即可偿凭。
設(shè)置item間的分隔線
注:這里可以把分隔線設(shè)置為一個顏色而叼,也可以設(shè)置為一個圖片資源神凑。
android:divider="@android:color/darker_gray" android:dividerHeight="10dp"
以下代碼可以把分隔線設(shè)置為透明:
android:divider="@null"
隱藏ListView的滾動條
android:scrollbars="none"
取消ListView的Item點擊效果
android:listSelector="#00000000"
android:listSelector="@android:color/transarent"
動態(tài)修改ListView
mData.add("new"); mAdapter.notifyDataSetChanged();
如上代碼店展,當修改了Adapter的映射List之后,只需要調(diào)用Adapter的notifyDatasetChanger()方法耘子,通知ListView修改數(shù)據(jù)源即可液南,需注意的是在使用mAdapter.notifyDataSetChanged()方法時,必須保證傳進Adapter的數(shù)據(jù)List是同一個List而不能是其他對象枚赡。
遍歷ListView中的所有Item
for (int i = 0; i < mListView.getChildCount(); i++) { View view = mListView.getChildAt(i); }
處理空ListView
setEmptyView()方法可以在ListView中無數(shù)據(jù)時設(shè)置一個默認的顯示布局氓癌,而當ListView有數(shù)據(jù)的時候則不會顯示,代碼示例如下:
ListView listView = (ListView)findViewById(R.id.listView); listView.setEmptyView(findViewById(R.id.empty_view));
ListView滑動監(jiān)聽
- 使用OnTouchListener()來實現(xiàn)滑動監(jiān)聽
mListView.setOnTouchListener(new View.OnTouchListener() {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
//觸摸時的操作
break;
case MotionEvent.ACTION_MOVE:
//移動時的操作
break;
case MotionEvent.ACTION_UP:
//手指離開屏幕時的操作
break;
}
});
- 使用OnScrollListener()來實現(xiàn)滑動監(jiān)聽
OnScrollListener是AbsListView中的監(jiān)聽事件贫橙,它封裝了很多與ListView相關(guān)的信息贪婉。以下是OnScrollListener的一般使用方法。
mListView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
//滑動停止時
Log.d("Test", "SCROLL_STATE_IDLE");
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
//正在滾動時
Log.d("Test", "SCROLL_STATE_TOUCH_SCROLL");
case OnScrollListener.SCROLL_STATE_FLING:
//手指拋開時
//在離開后卢肃,ListView由于慣性繼續(xù)滑動
Log.d("Test", SCROLL_STATE_FLING);
break;
}
}
/*
* view: 當前的ListView
* firstVisibleItem: 當前能看見的第一個Item的ID疲迂,包括顯示一小半的Item
* visibleItemCount: 當前能看見的Item總數(shù)
* totalItemCount: 整個ListView的Item總數(shù)。
*/
@Override
public void onScroll(AbsListView view,
int firstVisibleItem,
int visibleItemCount,
int totalItemCount) {
//滾動時一直調(diào)用
Log.d("Test", "onScroll");
}
})
- 判斷是否滾動到最后一行
if (firstVisibleItem + visibleItemCount == totalItemCount&&totalItem-Count>0) {
//滾動到最后一行
}
- 判斷滾動的方向
if (firstVisibleItem > lastVisibleItemPosition) {
//上滑
} else if (firstVisibleItem < lastVisibleItemPosition){
//下滑
}
lastVisibleItemPosition = firstVisibleItem;
- 獲取可視區(qū)域內(nèi)的Item
//獲取可視區(qū)域內(nèi)最后一個Item的id
mListView.getLastVisiblePosition();
//獲取可視區(qū)域內(nèi)第一個Item的id
mListView.getFirstVisiblePosition();
ListView常用擴展
具有彈性的ListView
//控制滑到邊緣到處理方法
@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, mMaxOverDistance, isTouchEvent);
}
根據(jù)滑動方向莫湘,自動隱藏toolbar
public class ScrollHideList extends AppCompatActivity {
private Toolbar mToolbar;
private ListView mListView;
private String[] mstr = new String[20];
private int mTouchSlop;
private float mFirstY;
private float mCurrentY;
private int direction;
private ObjectAnimator mAnimator;
private boolean mShow = true;
View.OnTouchListener myTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mFirstY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurrentY = event.getY();
if (mCurrentY - mFirstY > mTouchSlop) {
direction = 0;//down
} else if (mFirstY - mCurrentY > mTouchSlop) {
direction = 1;//up
}
if (direction == 1) {
if (mShow) {
toolbarAnim(1);//hide
mShow = !mShow;
}
} else if (direction == 0) {
if (!mShow) {
toolbarAnim(0);//show
mShow = !mShow;
}
}
break;
case MotionEvent.ACTION_UP:
break;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.scroll_hide);
mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mListView = (ListView) findViewById(R.id.listview);
for (int i = 0; i < mstr.length; i++) {
mstr[i] = "Item" + i;
}
View header = new View(this);
header.setLayoutParams(new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT,
(int) getResources().getDimension(
R.dimen.abc_action_bar_default_height_material)));
mListView.setAdapter(new ArrayAdapter<String>(ScrollHideList.this, android.R.layout.simple_expandable_list_item_1,
mstr));
mListView.setOnTouchListener(myTouchListener);
}
private void toolbarAnim(int flag) {
if (mAnimator != null && mAnimator.isRunning()) {
mAnimator.cancel();
}
if (flag == 0){
mAnimator = ObjectAnimator.ofFloat(mToolbar, "translationY", mToolbar.getTranslationY(),0);
} else {
mAnimator = ObjectAnimator.ofFloat(mToolbar, "translationY", mToolbar.getTranslationY(),-mToolbar.getHeight());
}
mAnimator.start();
}
}
動態(tài)改變ListView布局
public class FocusListViewAdapter extends BaseAdapter {
private List<String> mData;
private Context mContext;
private int mCurrentItem;
public FocusListViewAdapter(Context context, List<String> data) {
this.mContext = context;
this.mData = data;
}
public int getCount() {
return mData.size();
}
public Object getItem(int position) {
return mData.get(position);
}
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 (mCurrentItem == position) {
layout.addView(addFocusView(position));
} else {
layout.addView(addNormalView(position));
}
return layout;
}
public void setmCurrentItem(int currentItem) {
this.mCurrentItem = currentItem;
}
private View addFocusView(int i) {
ImageView iv = new ImageView(mContext);
iv.setImageResource(R.mipmap.ic_launcher);
return iv;
}
private View addNormalView(int i) {
LinearLayout layout = new LinearLayout(mContext);
layout.setOrientation(LinearLayout.HORIZONTAL);
ImageView iv = new ImageView(mContext);
iv.setImageResource(R.mipmap.ic_launcher);
layout.addView(iv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT));
TextView tv = new TextView(mContext);
tv.setText(mData.get(i));
layout.addView(tv,new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
layout.setGravity(Gravity.CENTER);
return layout;
}
}