相信接觸過開發的人一定會接觸ListView,相信接觸過ListView的人一定接觸過BaseAdapter,相信接觸過BaseAdapter的人一定很痛恨編寫擴充卡,因為它的數量往往跟ListView的總數是成正比的,是以我今天給大家介紹一款神器,萬能擴充卡! 在自定義擴充卡的時候,我們通常會自定義一個ViewHolder類,雖然這個名字是随便起的,但是就像約定俗成一樣,我們還是這麼用了這麼多年!當然,自定義萬能擴充卡,從它-ViewHolder開始,我們把所有與ViewHolder有關的操作都封裝起來,這樣在我們的擴充卡中,getView中的操作就會簡單很多。
package com.ctgu.adapter; import android.content.Context; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ViewHolder { private SparseArray<View> mView; private int mPosition; private View mConvertView; /** * 參數說明 * @param context 上下文 * @param parent ViewGroup * @param layoutId 布局檔案 * @param position 目前position */ public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mPosition = position; this.mView = new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } /** * @param context * @param convertView * @param parent * @param layoutId * @param position * @return 傳回一個ViewHolder */ public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) { if (convertView == null) { return new ViewHolder(context, parent, layoutId, position); } else { ViewHolder holder = (ViewHolder) convertView.getTag(); holder.mPosition = position; return holder; } } /* * 通過viewId擷取控件 */ public <T extends View> T getView(int viewId) { View view = mView.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mView.put(viewId, view); } return (T) view; } /** * 傳回視圖 * @return */ public View getmConvertView() { return mConvertView; } }
然後我們自定義自己的萬能擴充卡
package com.example.day19_viewholder; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; public abstract class CommonAdapters<T> extends BaseAdapter { protected Context context; protected List<T> list; protected LayoutInflater inflater; protected int layoutid; public CommonAdapters(Context context, List<T> list,int layoutid) { this.context = context; this.inflater = LayoutInflater.from(context); this.list = list; this.layoutid = layoutid; } @Override public int getCount() { // TODO Auto-generated method stub return list==null?0:list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list==null?null:list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent){ ViewHolder holder = ViewHolder.get(context, convertView, parent, layoutid, position); convert(holder, getItem(position)); return holder.getmConvertView(); } public abstract void convert(ViewHolder holder,Object t); }
其中,我們對外提供一個方法讓調用者對控件進行擷取并指派操作。 這樣就兩個類就完成了萬能擴充卡的制作,下面我們來使用下!
下面是MainAdapter.java
package com.example.day19_viewholder; import java.util.List; import android.content.Context; import android.widget.TextView; public class MyAdapter extends CommonAdapters<Jokes>{ public MyAdapter(Context context, List<Jokes> list) { super(context, list,R.layout.listview_item_jokes); // TODO Auto-generated constructor stub } @Override public void convert(ViewHolder holder, Object t) { Jokes joke = (Jokes) t; ((TextView)holder.getView(R.id.tv_jokes_title)).setText(joke.getTitle()); ((TextView)holder.getView(R.id.tv_jokes_time)).setText(joke.getTime()); ((TextView)holder.getView(R.id.tv_jokes_source)).setText(joke.getSource()); ((TextView)holder.getView(R.id.tv_jokes_content)).setText(joke.getContent()); } }
下面是MainActivity.java
package com.example.day19_viewholder; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.widget.ListView; public class MainActivity extends Activity { private ListView listview; private MyAdapter adapter; private List<Jokes> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listview = (ListView) findViewById(R.id.id_lv); list = new ArrayList<Jokes>(); //添加資料 for (int i = 0; i < 10; i++) { Jokes j = new Jokes("title"+i, "洋芋", "2015/9/8", "你是可愛的小蘋果"); list.add(j); } adapter = new MyAdapter(this, list); listview.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
下面是Jokes.java
package com.example.day19_viewholder; public class Jokes { private String title; private String source; private String time; private String content; public Jokes() { // TODO Auto-generated constructor stub } public Jokes(String title, String source, String time, String content) { super(); this.title = title; this.source = source; this.time = time; this.content = content; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
最後附上效果圖,說明是沒有問題的,哈哈!
最後附上源碼下載下傳位址,當然是不需要積分就可以下載下傳的,知識就是要分享嘛!
源碼下載下傳位址:http://download.csdn.net/detail/u010998327/9114647