1. 程式人生 > >android專案中提取公共adapter的寫法

android專案中提取公共adapter的寫法

        在android專案中,有時候我們需要寫很多個介面卡,這時候,adapter就會有很多個,會造成程式碼重複。這時候,我們就可以考慮提取一個公共的CommonAdapter出來。

      我們將公用的一些方法放在這個adpater中,將這個adapter定義為抽象類,把公用的方法放在這個抽象類中實現,然後讓子類自己去重寫getView方法。

        如下是這個公用的CommonAdapter,它繼承BaseAdapter,重寫了getCount,getItemgetItemId這三個抽象方法,這樣的話getCount,getItem,getItemId這三個方法就相當於

CommonAdapter這個抽象類的普通方法,它的子類就不需要重寫了,因為子類只需要重寫抽象類的抽象方法,然後留下getView()方法放在子類中去重寫。

   下面是例子

公共提成的抽象類CommonAdapter

public abstract class CommonAdapter<T> extends BaseAdapter {
    protected Context mContext;//定義成protected,用來給子類訪問
protected List<T> mList = new ArrayList<T>();

    public 
CommonAdapter(Context context, List<T> list) { this.mContext = context; this.mList = list; } protected View.OnClickListener onClickListener;//定義成protected,讓子類重寫 public void setOnClickListener(View.OnClickListener onClickListener) { this.onClickListener = onClickListener; } @Override
public int getCount() { return mList.size(); } @Override public T getItem(int position) { if (position < mList.size()) { return mList.get(position); } return null; } @Override public long getItemId(int position) { return position; } /** * 新增資料, * * @param aList */ public void addData(List<T> aList) { if (aList != null && aList.size() > 0) { mList.addAll(aList); } notifyDataSetChanged(); } /** * 獲取資料 * * @return */ public List<T> getData() { return mList; } /** * 設定資料, * * @param sList */ public void setData(List<T> sList) { mList.clear(); addData(sList); } }
我們一般用到的adapter
public class MainAdapter extends CommonAdapter {
    public MainAdapter(Context context, List list) {
        super(context, list);
    }

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
            viewHolder.tvName = (TextView) convertView
                    .findViewById(R.id.tv_main);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        if (position < mList.size()) {
            viewHolder.tvName.setText(mList.get(position) + "");
        }
        return convertView;
    }

    class ViewHolder {
        TextView tvName;
    }
}
Activity
public class MainActivity extends Activity {
    private ArrayList<Integer> list = new ArrayList<Integer>();
    private MainAdapter mMainAdapter;
    private ListView mListView;

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initList();
    }

    private void initView() {
        mListView = (ListView) findViewById(R.id.ls_main);
    }

    public void initList() {
        for (int i = 0; i < 8; i++) {
            list.add(i);
        }
        mMainAdapter = new MainAdapter(this, list);
        mListView.setAdapter(mMainAdapter);
    }
}

activity_main.xml
<ListView
android:id="@+id/ls_main"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
item_list.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/tv_main"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>