android LinearLayoutForListView


由於 scrollview 套 listview 會有很多問題,網上很多人用 LinearLayout 模擬 listview, 也可以設置 adapter。

很多人直接繼承 BaseAdapter, 可能是偷懶吧, 其實沒有必要, BaseAdapter 里面有很多其它無用的方法被繼承,

其次 getView 等方法的簽名可能不太符合, 直接定義一個接口或抽象類更好。

這種方式在界面中有很多動態 list 布局時,抽離出來可能會靈活一些。 不用在代碼中每次都 for 循環,動態創建 view 再添加。

如果這種動態布局不是很多的話,直接 for 循環就行, 簡單點的直接擴展一下 LinearLayout 也行。

當到處都是 list 動態布局時而 ListView 又不好用, 這種模擬 ListView setAdapter 的方式會靈活一些,代碼復用性好一些。

 

1 可以簡單的定義一個接口供子 adapter 實現

public interface MyLinearLayoutInterface {
    int getCount();

    Object getItem(int position);

    View getView(int position);
}

2 如果子類代碼比較重復的話,也可以抽出一個基類

public abstract class LinearLayoutBaseAdapter {
    private List<? extends Object> list;
    private Context context;

    public LinearLayoutBaseAdapter(Context context, List<? extends Object> list) {
        this.context = context;
        this.list = list;
    }

    public LayoutInflater getLayoutInflater() {
        if (context != null) {
            return LayoutInflater.from(context);
        }

        return null;
    }

    public int getCount() {
        if (list != null) {
            return list.size();
        }

        return 0;
    };

    public Object getItem(int position) {
        if (list != null) {
            return list.get(position);
        }

        return null;
    };

    /**
     * 供子類復寫
     * 
     * @param position
     * @return
     */
    abstract View getView(int position);
}

3 主類將 adapter 里面的 view 全部加入 LinearLayout 並設置回調監聽

public class MyLinearLayoutForListView extends LinearLayout {
    private LinearLayoutBaseAdapter adapter;
    private OnItemClickListener onItemClickListener;

    public MyLinearLayoutForListView(Context context) {
        super(context);
    }

    public MyLinearLayoutForListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setAdapter(LinearLayoutBaseAdapter adapter) {
        this.adapter = adapter;
        // setAdapter 時添加 view
        bindView();
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;

    }

    /**
     * 綁定 adapter 中所有的 view
     */
    private void bindView() {
        if (adapter == null) {
            return;
        }

        for (int i = 0; i < adapter.getCount(); i++) {
            final View v = adapter.getView(i);
            final int tmp = i;
            final Object obj = adapter.getItem(i);

            // view 點擊事件觸發時回調我們自己的接口
            v.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    if (onItemClickListener != null) {
                        onItemClickListener.onItemClicked(v, obj, tmp);
                    }
                }
            });

            addView(v);
        }
    }

    /**
     * 
     * 回調接口
     */
    public interface OnItemClickListener {
        /**
         * 
         * @param v
         *            點擊的 view
         * @param obj
         *            點擊的 view 所綁定的對象
         * @param position
         *            點擊位置的 index
         */
        public void onItemClicked(View v, Object obj, int position);
    }
}

4 前台代碼

List<Info> list = new ArrayList<Info>();
MyLinearLayoutForListView layout = (MyLinearLayoutForListView) findViewById(R.id.mylayout);

MyAdapter adapter = new MyAdapter(this, list);
layout.setAdapter(adapter);

layout.setOnItemClickListener(new MyLinearLayoutForListView.OnItemClickListener() {

    @Override
    public void onItemClicked(View v, Object obj, int position) {
        Info info = (Info) obj;
        if (info != null) {
            // do something
        }
    }
});

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM