1. 程式人生 > >安卓中自定義LinerLayout實現listview的效果

安卓中自定義LinerLayout實現listview的效果

public class LinearLayoutForNet extends LinearLayout {
private NetBasePaiAdapter adapter;

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

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

    public void setAdapter(NetBasePaiAdapter adapter,int 
itemId) { this.adapter = adapter; //相互繫結 adapter.setLayout(this,itemId); //setAdapter 時新增 view bindView(); } /** * 繫結 adapter 中所有的 view */ public void bindView() { if (adapter == null) { return; } removeAllViews(); for
(int i = 0; i < adapter.getCount(); i++) { final View v = adapter.getView(i); addView(v); } } OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { //注意這裡使用getTag方法獲取資料
mOnItemClickListener.onItemClick(v,(int)v.getTag()); } } }; //給itemView新增點選事件的介面 public static interface OnItemClickListener { void onItemClick(View view, int position); } private OnItemClickListener mOnItemClickListener = null; public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; } }
public class NetP1InnerPaiAdapter extends NetBaseInnerPaiAdapter {

    //需要繫結的控制元件
private LinearLayoutForNet layout;

    //快取convertView的集合
private List<View> convertViews = new ArrayList<View>();

    //快取ImageView的集合
private List<ImageView> imageViews = new ArrayList<ImageView>();

    //內牌組集合
private List<NetPai> innerPaiList;

    //是否剛剛摸牌,以此設定間距
private boolean haveMoPai;

    @Override
//設定控制元件
public void setLayout(LinearLayoutForNet layout,int itemId) {
        this.layout = layout;
        for(int i=0;i<15;i++) {
            View convertView = Global.inflate(itemId,layout);
            convertViews.add(convertView);
            imageViews.add((ImageView) convertView.findViewById(R.id.iv_inner_pai));
        }
    }

    @Override
//設定數目,此處不需要實現
public void setCount(int count,boolean haveMoPai) {}

    @Override
//當集合資料變化時呼叫
public void setData(List<NetPai> innerPaiList,boolean haveMoPai) {
        this.innerPaiList = innerPaiList;
        //初始化資源id
for(NetPai netPai:innerPaiList) {
            NetPaiResIdUtil.setP1InnerPaiResId(netPai);
        }
        this.haveMoPai = haveMoPai;
        notifyDataSetChanged();
    }


    //繫結後,即可呼叫LinearLayoutForListView的新增view的方法
public void notifyDataSetChanged() {
        if (layout != null) {
            layout.bindView();
        }
    }

    @Override
public int getCount() {
        return innerPaiList==null?0:innerPaiList.size();
    }

    @Override
//獲取
public View getView(int position) {
        ImageView ivInnerPai = imageViews.get(position);
        ivInnerPai.setBackgroundResource(innerPaiList.get(position).getResId());
        View convertView = convertViews.get(position);
        setTag(convertView,position);
        setMoPaiMargin(position,convertView);
        return convertView;
    }

    //給convertView打上tag
private void setTag(View convertView, int position) {
        if(haveMoPai&&position==innerPaiList.size()-1) {
            convertView.setTag(-1);
        }else {
            convertView.setTag(position);
        }
    }

    //如果有摸牌,設定間隔
private void setMoPaiMargin(int position, View convertView) {
        if (haveMoPai) {
            if (position==innerPaiList.size()-1) {
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                params.setMargins(15,0,0,0);//保持左間距就行了
convertView.setLayoutParams(params);
            }
        }
    }

    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            //注意這裡使用getTag方法獲取資料
mOnItemClickListener.onItemClick(v,(Pai)v.getTag());
        }
    }

    //給itemView新增點選事件的介面
public static interface OnItemViewClickListener {
        void onItemClick(View view, Pai pai);
    }

    private OnItemViewClickListener mOnItemClickListener = null;

    public void setOnItemClickListener(OnItemViewClickListener listener) {
        this.mOnItemClickListener = listener;
    }
}
public abstract class NetBaseInnerPaiAdapter extends NetBasePaiAdapter{

    //設定資料
public abstract void setData(List<NetPai>innerPaiList,boolean haveMoPai);

    //設定牌的數目
public abstract void setCount(int count,boolean haveMoPai);
}
public abstract class NetBasePaiAdapter {
    //設定控制元件
public  abstract void setLayout(LinearLayoutForNet layout, int itemId);

    //獲取牌的數目
public abstract int getCount();

    //獲取view
public abstract View getView(int position);

}