Android菜鳥練習第六課 萬能適配器

第一部分 ViewHolder
public class ViewHolder {
    private final SparseArray<View> mViews;
    private int mPosition;
    private View mConvertView;

    private ViewHolder(Context context, ViewGroup parent, int layoutId,
                       int position) {
        this.mPosition = position;
        this.mViews = new SparseArray<View>();
        mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
        // setTag
        mConvertView.setTag(this);
    }

    /**
     * 拿到一個ViewHolder對象
     *
     * @param context
     * @param convertView
     * @param parent
     * @param layoutId
     * @param position
     * @return
     */
    public static ViewHolder get(Context context, View convertView,
                                 ViewGroup parent, int layoutId, int position) {
        if (convertView == null) {
            return new ViewHolder(context, parent, layoutId, position);
        }
        return (ViewHolder) convertView.getTag();
    }

    public View getConvertView() {
        return mConvertView;
    }

    /**
     * 通過控件的Id獲取對於的控件,如果沒有則加入views
     *
     * @param viewId
     * @return
     */
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }

    /**
     * 爲TextView設置字符串
     *
     * @param viewId
     * @param text
     * @return
     */
    public ViewHolder setText(int viewId, String text) {
        TextView view = getView(viewId);
        if (view == null) {
            Log.e("ViewHolder", "沒有找到控件:" + viewId + " - " + text);
        } else {
            view.setText(text);

        }
        return this;
    }

    public ViewHolder setVisibility(int viewId, int visibility) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findViewById(viewId);
        }
        if (view != null) {
            mViews.put(viewId, view);
            view.setVisibility(visibility);
        }
        return this;
    }

    /**
     * 爲ImageView設置圖片
     *
     * @param viewId
     * @param drawableId
     * @return
     */
    public ViewHolder setImageResource(int viewId, int drawableId) {
        ImageView view = getView(viewId);
        view.setImageResource(drawableId);

        return this;
    }

    /**
     * 爲ImageView設置圖片
     *
     * @param viewId
     * @param bm
     * @return
     */
    public ViewHolder setImageBitmap(int viewId, Bitmap bm) {
        ImageView view = getView(viewId);
        view.setImageBitmap(bm);
        return this;
    }

    /**
     * 爲ImageView設置圖片
     *
     * @param viewId
     * @param url
     * @return
     */
    public ViewHolder setImageByUrl(int viewId, String url) {
        //ImageLoad.load( (ImageView) getView(viewId),url);
        return this;
    }

    public int getPosition() {
        return mPosition;
    }
}


第二部分 適配器

public abstract class ListAdapter<T> extends BaseAdapter {

    protected LayoutInflater inflater;
    protected Context context;
    protected List<T> datas;
    protected final int itemLayoutId;
    protected boolean busy = false;

    public ListAdapter(Context context, List<T> datas, int itemLayoutId) {
        this.context = context;
        this.inflater = LayoutInflater.from(this.context);
        this.datas = datas;
        this.itemLayoutId = itemLayoutId;
    }

    public void setBusy(boolean busy) {
        this.busy = busy;
    }

    public boolean isBusy() {
        return busy;
    }

    public List<T> getData() {
        return this.datas;
    }

    @Override
    public int getCount() {
        if (this.datas == null) {
            return 0;
        }
        return datas.size();
    }

    @Override
    public T getItem(int position) {
        if (this.datas == null) {
            return null;
        }
        return datas.get(position);
    }

    public void removeData(int position) {
        if (this.datas == null) {
            return;
        } else if (this.datas.size() <= position) {
            return;
        }
        this.datas.remove(position);
        notifyDataSetChanged();
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    /**
     * 清除數據
     */
    public void clearData() {
        if (this.datas != null) {
            this.datas.clear();
        }
        notifyDataSetChanged();
    }

    public void addData(T data) {
        if (this.datas == null) {
            this.datas = new ArrayList<T>();
        }
        this.datas.add(data);
        notifyDataSetChanged();
    }

    public void addToFirst(T data) {
        if (this.datas == null) {
            this.datas = new ArrayList<T>();
            this.datas.add(data);
        } else {
            this.datas.add(0, data);
        }
        notifyDataSetChanged();
    }


    public void addData(List<T> datas) {
        if (datas == null) {
            return;
        }
        if (this.datas == null) {
            this.datas = datas;
        } else {
            if (datas.size() > 20) {
                datas.remove(0);
            }
            this.datas.addAll(datas);
        }
        notifyDataSetChanged();
    }

    public void setData(List<T> datas) {
        this.datas = datas;
        notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        final ViewHolder viewHolder = getViewHolder(position, convertView, parent);
        try {
            convert(position, viewHolder, getItem(position));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return viewHolder.getConvertView();

    }

    public abstract void convert(int position, ViewHolder helper, T item);


    public ViewHolder getViewHolder(int position, View convertView, ViewGroup parent) {

        return ViewHolder.get(this.context, convertView, parent, this.itemLayoutId, position);
    }

    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {
        if (observer != null) {
            super.unregisterDataSetObserver(observer);
        }
    }
}

第三部分 JavaBean
public class Bean {
    public String topString;
    public String bottomString;

    public String getBottomString() {
        return bottomString;
    }

    public void setBottomString(String bottomString) {
        this.bottomString = bottomString;
    }

    public String getTopString() {
        return topString;
    }

    public void setTopString(String topString) {
        this.topString = topString;
    }
}
第四部分 佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/lv"/>
</RelativeLayout>

第五部分 item佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tv_top"
        android:textSize="18sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/tv_bottom"
        android:textSize="28sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

第六部分 Activity
public class MainActivity extends AppCompatActivity {
    public ListView mListView;
    public ArrayList<Bean> datas = new ArrayList<Bean>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //填充假數據
        initData();

        mListView = (ListView) findViewById(R.id.lv);
        mListView.setAdapter(new MyAdapter(this,datas,R.layout.item_normal));

    }

   public class MyAdapter extends ListAdapter<Bean>{


       public MyAdapter(Context context, List<Bean> datas, int itemLayoutId) {
           super(context, datas, itemLayoutId);
       }

       @Override
       public void convert(int position, ViewHolder helper, Bean item) {
           helper.setText(R.id.tv_top,item.getTopString());
           helper.setText(R.id.tv_bottom,item.getBottomString());
       }

   }

    public void initData(){
        Bean bean = new Bean();
        bean.setTopString("111111");
        bean.setBottomString("222222222222222");
        Bean bean1 = new Bean();
        bean1.setTopString("222222");
        bean1.setBottomString("333333333333333");
        Bean bean2 = new Bean();
        bean2.setTopString("4444444");
        bean2.setBottomString("555555555555555");
        Bean bean3 = new Bean();
        bean3.setTopString("6666666");
        bean3.setBottomString("777777777777777");
        Bean bean4 = new Bean();
        bean4.setTopString("8888888");
        bean4.setBottomString("999999999999999");
        Bean bean5 = new Bean();
        bean5.setTopString("000000");
        bean5.setBottomString("---------------");

        datas.add(bean);
        datas.add(bean1);
        datas.add(bean2);
        datas.add(bean3);
        datas.add(bean4);
        datas.add(bean5);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章