下面我們將以一個例子來講述ListView之自定義適配器
首先我們看一下效果圖:
【分析】
首先:需要創建一個ListView控件,自定義適配器是為了實現自定義ListView的ListView_Item,所以我們應該在創建一個Item
然后書寫自定義適配器,自定義適配器的時候需要繼承BaseAdapter,然后實現它的未實現的4個方法,然后在實現自定義適配器的構造方法,其構造方法的參數為山下文對象,數據源,必須實現的4個方法主要是對數據源進行過操作,
然后考慮優化方面,我們使用了ViewHolder Pattern,用它的優點(我們來看一下來自國外網友的看法):
Now let’s see how it works with the ViewHolder pattern.
1.The first time it was loaded, convertView is null. We’ll have to inflate our list item layout, instantiate the ViewHolder, find the TextView via
findViewById·() and assign it to the ViewHolder, and set the ViewHolder as tag of convertView.
2.The second time it was loaded, convertView is not null, good! We don’t have to inflate it again. And here’s the sweet thing, we won’t have to call
findViewById() since we can now access the TextView via its ViewHolder.
3.The following time it was loaded, convertView is definitely not null. The findViewById() is never called again, and that makes our smooth ListView scrolling.
【 附上原文:http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html 】
以下來自國內網友的看法:
ViewHolder將需要緩存的view封裝好,convertView的setTag才是將這些緩存起來供下次調用。 當你的listview里布局多樣化的時候 viewholder的作用體現明顯,效率再一次提高。 View的findViewById()方法也是比較耗時的,因此需要考慮只調用一次,之后就用View.getTag()方法來獲得 ViewHolder對象。(小編比較贊同這個)
【編碼】
首先,我們先看自定義適配器這部分的代碼:
package cn.edu.bzu.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import org.w3c.dom.Text; import java.util.List; import cn.edu.bzu.entity.Bean; import cn.edu.bzu.listview_demo.R; /** * Created by monster on 2015/4/19. */ public class MyListViewAdapter extends BaseAdapter { private LayoutInflater mInflater; //LayoutInflater是用來找layout下xml布局文件,並且實例化 private List<Bean> mlist; public MyListViewAdapter(Context context,List<Bean> list) { mInflater=LayoutInflater.from(context); //得到初始化上下文 mlist=list; } @Override public int getCount() { return mlist.size(); } @Override public Object getItem(int position) { return mlist.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder=null; if(convertView==null){ convertView=mInflater.inflate(R.layout.listview_item,null); //將布局轉換成視圖 holder=new ViewHolder(); holder.mTitle=(TextView)convertView.findViewById(R.id.id_title); holder.mDesc=(TextView)convertView.findViewById(R.id.id_desc); holder.mDate=(TextView)convertView.findViewById(R.id.id_time); holder.mPhone=(TextView)convertView.findViewById(R.id.id_phone); convertView.setTag(holder); }else { //ViewHolder被復用 holder=(ViewHolder)convertView.getTag(); } holder.mTitle.setText(mlist.get(position).getTitle()); holder.mDesc.setText(mlist.get(position).getDesc()); holder.mPhone.setText(mlist.get(position).getPhone()); holder.mDate.setText(mlist.get(position).getDate()); return convertView; } private class ViewHolder{ TextView mTitle; TextView mDesc; TextView mDate; TextView mPhone; } }
然后我們看一下MainActivity.java
package cn.edu.bzu.listview_demo; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.widget.ListView; import java.util.ArrayList; import java.util.List; import cn.edu.bzu.adapter.MyListViewAdapter; import cn.edu.bzu.entity.Bean; public class MainActivity extends ActionBarActivity { private ListView listView; private List<Bean> list; private MyListViewAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getData(); initView(); } private void initView() { listView=(ListView)findViewById(R.id.ListView); listView.setAdapter(adapter); } private void getData() { list=new ArrayList<Bean>(); list.add(new Bean("Android新技能1","Android打造萬能的ListView和GridView適配器1","2015-04-19","10086")); list.add(new Bean("Android新技能2","Android打造萬能的ListView和GridView適配器2","2015-04-19","10086")); list.add(new Bean("Android新技能3","Android打造萬能的ListView和GridView適配器3","2015-04-19","10086")); list.add(new Bean("Android新技能4","Android打造萬能的ListView和GridView適配器4","2015-04-19","10086")); adapter=new MyListViewAdapter(MainActivity.this,list); } }
--------------------------------------------------------------------------------------------------------------------------------------------
【總結】
創建自定義適配器的步驟:
1.繼承BaseAdapter,實現BaseAdapter未實現的方法,包括(getCount(),getItem(),getItemId(),getView())
2.創建含參的構造方法,參數包括(Context ,List集合)
3.創建ViewHolder類,ViewHolder主要包括listView_Item的控件類型
4.書寫getView方法,包括實例化控件,控件賦值
【項目托管】
URL:(https://github.com/monsterLin/ListView_Custom-adapter);
--來自Android Stdio編寫