天天看點

ListView_擴充卡之萬能擴充卡_實作多個ListView公用同一個擴充卡

    相信接觸過開發的人一定會接觸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;              }              }           

    最後附上效果圖,說明是沒有問題的,哈哈!

ListView_擴充卡之萬能擴充卡_實作多個ListView公用同一個擴充卡

     最後附上源碼下載下傳位址,當然是不需要積分就可以下載下傳的,知識就是要分享嘛!

    源碼下載下傳位址:http://download.csdn.net/detail/u010998327/9114647