安卓中自定義LinerLayout實現listview的效果
阿新 • • 發佈:2019-01-28
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,intitemId) { 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); }