天天看點

ListView的擴充卡和Holder的封裝1未封裝标準寫法2封裝BaseHolder3實體Holder4封裝BaseAdapter5實體Adapter

  • 1未封裝标準寫法
  • 2封裝BaseHolder
  • 3實體Holder
  • 4封裝BaseAdapter
  • 5實體Adapter

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();  
        }  

    }