1. 程式人生 > >ListView的介面卡和Holder的封裝

ListView的介面卡和Holder的封裝

1未封裝標準寫法

MyAdapter.java

class MyAdapter extends BaseAdapter {

        private ArrayList data;

        public MyAdapter(List data){
            this.data = data;
        }
        @Override  
        public int getCount() {  
            return data.size();  
        }  
        @Override  
        public
Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if
(convertView == null){ holder = new ViewHolder(); // 1.載入佈局檔案 View view = View.inflate(context, R.layout.listviewitem, null); // 2.初始化控制元件 holder.textView = view.findViewById(R.id.textView1); // 3.打一個tag標記
view.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } // 4.設定資料重新整理內容 holder.textView.setText("設定內容"); return convertView; } } static class ViewHolder { TextView textView; }

2封裝BaseHolder

MyBaseHolder.java

public abstract class MyBaseHolder<T> {  
    // 一個item的根佈局  
    private View mRootView;  
    // 一個item的資料  
    private T data;  

    // 當new這個物件時, 就會載入佈局, 初始化控制元件,設定tag  
    public MyBaseHolder() {  
        mRootView = initView();  
        // 3. 打一個標記tag  
        mRootView.setTag(this);  
    }  
    // 1. 載入佈局檔案  
    // 2. 初始化控制元件 findViewById  
    public abstract View initView();  
    // 返回item的佈局物件  
    public View getRootView() {  
        return mRootView;  
    }  
    // 設定當前item的資料  
    public void setData(T data) {  
        this.data = data;  
        refreshView(data);  
    }  
    // 獲取當前item的資料  
    public T getData() {  
        return data;  
    }  
    // 4. 根據資料來重新整理介面  
    public abstract void refreshView(T data);  
}  

3實體Holder

SpecificHolder.java

public class SpecificHolder extends MyBaseHolder<String> {  

    private TextView mTextView;  

    @Override  
    public View initView() {  
        // 1. 載入佈局  
        View view = View.inflate(null, R.layout.item_listview, null);  
        // 2. 初始化控制元件  
        mTextView = (TextView) view.findViewById(R.id.textView1);  
        return view;  
    }  

    @Override  
    public void refreshView(String data) {  
        // 3. 設定內容重新整理介面  
        mTextView.setText(data);  
    }  

}  

4封裝BaseAdapter

MyBaseAdapter.java

public abstract class MyBaseAdapter<T> extends BaseAdapter {

    private ArrayList<T> data;

    public MyBaseAdapter(ArrayList<T> data) {
        this.data = data;
    }
    @Override
    public int getCount() {
        return data.size();
    }
    @Override
    public T getItem(int position) {
        return data.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MyBaseHolder<T> baseHolder;
        if(convertView == null){
            // 1. 載入佈局檔案
            // 2. 初始化控制元件 findViewById
            // 3. 打一個標記tag
            baseHolder = getHolder();
        }else{
            baseHolder = (MyBaseHolder<T>) convertView.getTag();
        }
        // 4. 設定內容重新整理介面
        baseHolder.setData(getItem(position));
        return baseHolder.getRootView();
    }

    public abstract MyBaseHolder<T> getHolder();
}

5實體Adapter

MyAdapter.java

class MyAdapter extends MyBaseAdapter<String>{  

        public MyAdapter(ArrayList<String> data) {  
            super(data);  
        }  

        @Override  
        public MyBaseHolder<String> getHolder() {  
            return new SpecificHolder();  
        }  

    }