ListView使用技巧-更新中
雖然在Android5.X中,RecyclerView在很多地方組件取代了ListView,但是ListView的使用依然是分廣泛。
本博文將對以下兩方面的內容進行介紹
1. ListView常用技巧
2. ListView常用拓展
具體代碼請移步GitHub
ListView常用優化技巧
1. 使用ViewHolder模式提高效率
1. 使用ViewHolder模式提高效率
ViewHolder模式充分利用了ListView的視圖緩存機制,避免了每次在getView()時重復的調用findViewById().
使用ViewHoder的步驟:
1. 在自定義的Adapter中定義一個內部類ViewHolder,并將Item布局中的控件作為成員變量
2. 接下來只要在getView()方法中通過視圖緩存機制來重用以緩存即可。
2. 設置項目間分割符
2.設置項目間分隔線
ListView各個項目之間,可以通過設置分隔線來進行區分,系統提供了divider和dividerHeight這兩個屬性來幫我們實現這一功能。
通過這兩個屬性可以控制他們之間的分隔線和分隔線的高度。
當然,分隔線不僅僅可以設置為一個顏色,也可以設置為圖片資源,分隔線的使用代碼如下:
或者動態設置,必須先setDivider ,然后在setDiveiderHeight,否則不生效
listView.setDivider(new ColorDrawable(Color.GREEN));listView.setDividerHeight(3);原因:
源碼如下
注意:
if (divider != null) { mDividerHeight = divider.getIntrinsicHeight(); public int getIntrinsicHeight() { return -1; }如果想要將分隔線設置為透明:
listView.setDivider(null);
或者
android:divider=”@null”
3. 隱藏ListView的滾動條
3.隱藏ListView的滾動條
默認的ListView在滾動時,在右邊會顯示滾動條,指定當前滾定的位置。我們可以通過scrollbars屬性來控制ListView的滾動狀態。特別的,當scrollbars設置為none時,ListView無論滾動還是不滾動,就都不會出現滾動條了。
4. 取消ListView的Item點擊效果
4. 取消ListView的Item點擊效果
當點擊ListView的某一項Item時,系統默認會出現一個點擊效果,在Android5.X上是一個波紋的效果,而在5.X以下是一個改變背景顏色的效果,但是我們可以通過修改listSelector屬性來取消點擊后的回饋效果。
當然也可以是用Android系統自帶的透明色來實現這個效果
android:listSelector="@android:color/transparent"或者在代碼中
listView.setSelector(new ColorDrawable(Color.TRANSPARENT));5. 設置ListView需要顯示在第幾行
ListView以Item為單位進行顯示,默認顯示第一個Item,當需要指定具體的Item時,可以通過如下代碼來實現
ListView.setSelection(N);其中N就是要顯示的第N個Item。
當然,這個方法類似于scrollTo,是瞬間完成的移動。
如果想實現平滑移動:
listView.smoothScrollBy(distance,duration); listView.smoothScrollBy(offset); listView.smoothScrollToPostion(index);6. 動態修改ListView-notifyDataSetChanged
notifyDataSetChanged
mData.add("new"); notifyDataSetChanged();當修改了傳遞給Adapter的映射List之后,只需要通過調用Adapter的notifyDataSetChanged方法,通知ListView更改數據源即可完成對ListView的動態修改。
注意:在使用mAdapter.notifyDataSetChanged方法時,必須保證傳進Adapter的數據List是同一個List而不能是其他對象,否則將無法實現改效果。
NotifyTest.java
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ListView;import java.util.ArrayList; import java.util.List;public class NotifyTest extends Activity {private List<String> mData;private ListView mListView;private NotifyAdapter mAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.notify);mData = new ArrayList<String>();for (int i = 0; i < 20; i++) {mData.add("" + i);}mListView = (ListView) findViewById(R.id.listView);mAdapter = new NotifyAdapter(this, mData);mListView.setAdapter(mAdapter);for (int i = 0; i < mListView.getChildCount(); i++) {View view = mListView.getChildAt(i);}}public void btnAdd(View view) {mData.add("new");mAdapter.notifyDataSetChanged();mListView.setSelection(mData.size() - 1);} }notify.xml
<LinearLayout 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"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"><ListView android:id="@+id/listView"android:layout_width="match_parent"android:layout_height="0dp"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:layout_weight="9"android:fastScrollEnabled="true" /><Button android:id="@+id/button"android:layout_width="match_parent"android:layout_height="0dp"android:layout_alignEnd="@+id/listView"android:layout_alignParentBottom="true"android:layout_alignParentStart="true"android:layout_weight="1"android:onClick="btnAdd"android:text="Add" /> </LinearLayout>NotifyAdapter.java
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView;import java.util.List;public class NotifyAdapter extends BaseAdapter {private List<String> mData;private LayoutInflater mInflater;public NotifyAdapter(Context context, List<String> data) {this.mData = data;mInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return mData.size();}@Overridepublic Object getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;// 判斷是否緩存if (convertView == null) {holder = new ViewHolder();// 通過LayoutInflater實例化布局convertView = mInflater.inflate(R.layout.notify_item, null);holder.img = (ImageView) convertView.findViewById(R.id.imageView);holder.title = (TextView) convertView.findViewById(R.id.textView);convertView.setTag(holder);} else {// 通過tag找到緩存的布局holder = (ViewHolder) convertView.getTag();}// 設置布局中控件要顯示的視圖holder.img.setBackgroundResource(R.drawable.ic_launcher);holder.title.setText(mData.get(position));return convertView;}public final class ViewHolder {public ImageView img;public TextView title;} }notify_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal"><ImageView android:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_launcher" /><TextView android:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Large Text"android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout>7. 遍歷ListView中所有的Item
ListView作為一個ViewGroup,為我們提供了操作子View的各種方法,最常見的就是通過getChildAt()來獲取第i個子View,代碼如下:
for (int i = 0; i < mListView.getChildCount(); i++) {View view = mListView.getChildAt(i);}總結
以上是生活随笔為你收集整理的ListView使用技巧-更新中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发工具新接触
- 下一篇: Imageloader7-获取图片需要显