1. 程式人生 > >自定義ListView listView中子控制元件獲取點選position

自定義ListView listView中子控制元件獲取點選position

自定義一個listView ,然後再new 出來的BaseAdapter的繼承類中實現監聽和獲取position。然後自己封裝了一個Adapter。其中借鑑了網上別人的程式碼,然後作了部分修改,做個mark。

借鑑地址:http://blog.csdn.net/xinqiqi123/article/details/6800437   謝謝這位




public class AddrItemInfoAdapter extends BaseAdapter
{
private InfoActivity infoActivity;
private AddrInfos addrInfos;
private LayoutInflater listContainer;
private Button curDel_btn;
private ImageView curEdit_Img;
private float x,ux;
private AddrInfo addrInfo;

private AddrListView addrListView;
private ListView listView;


final static class AddrListView
{
public TextView name;
public TextView tel;
public TextView addr;
public ImageView editIView;//自定義控制元件
public Button delBtn;//自定義控制元件
public int position;
}

public AddrItemInfoAdapter(InfoActivity infoActivity, AddrInfos addrInfos,ListView listView)
{
this.infoActivity = infoActivity;
this.addrInfos = addrInfos;

this.listContainer = LayoutInflater.from(infoActivity);
this.listView = listView ;
listView.setAdapter(this);
}

@Override
public int getCount()
{
return addrInfos.addrInfoList.size();
}

@Override
public Object getItem(int position)
{
return addrInfos.addrInfoList.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
//AddrListView addrListView = null;

if (convertView == null)
{
addrListView = new AddrListView();
// 獲取list_item佈局檔案的檢視
convertView = listContainer.inflate(R.layout.info_addr_item_layout,
null);
// 獲取控制元件物件
addrListView.name = (TextView) convertView
.findViewById(R.id.show_name);
addrListView.tel = (TextView) convertView
.findViewById(R.id.show_tel);
addrListView.addr = (TextView) convertView
.findViewById(R.id.show_addr);
addrListView.editIView = (ImageView) convertView
.findViewById(R.id.edit_imageview);
addrListView.delBtn = (Button) convertView
.findViewById(R.id.addr_del_bt);
// 設定控制元件集到convertView
convertView.setTag(addrListView);
convertView.setActivated(false);

}
else
{
addrListView = (AddrListView) convertView.getTag();
// 獲取控制元件物件
addrListView.name = (TextView) convertView
.findViewById(R.id.show_name);
addrListView.tel = (TextView) convertView
.findViewById(R.id.show_tel);
addrListView.addr = (TextView) convertView
.findViewById(R.id.show_addr);
addrListView.editIView = (ImageView) convertView
.findViewById(R.id.edit_imageview);
addrListView.delBtn = (Button) convertView
.findViewById(R.id.addr_del_bt);

}
addrListView.position = position;  //獲取每個物件中的positon
addrListView.name.setText((CharSequence) addrInfos.addrInfoList
.get(position).name);
addrListView.tel.setText((CharSequence) addrInfos.addrInfoList
.get(position).tel);
addrListView.addr
.setText((CharSequence) (addrInfos.addrInfoList.get(position).city + addrInfos.addrInfoList
.get(position).addr));

convertView.setOnTouchListener(new OnTouchListener() {

/*
* 實現滑動效果 滑動顯示控制元件然後操作
*/
@Override
public boolean onTouch(View v, MotionEvent event)
{



final AddrListView addrListView = (AddrListView) v.getTag();
// 當按下時處理
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
// 設定背景為選中狀態
// v.setBackgroundResource(R.drawable.mm_listitem_pressed);

x = event.getX();
// 判斷之前是否出現了刪除按鈕如果存在就隱藏
if (curDel_btn != null||curEdit_Img != null)
{
curDel_btn.setVisibility(View.GONE);
curEdit_Img.setVisibility(View.GONE);
}
}
else if (event.getAction() == MotionEvent.ACTION_UP)
{// 鬆開處理
// 獲取鬆開時的x座標
ux = event.getX();
// 判斷當前項中按鈕控制元件不為空時
if (addrListView.delBtn != null || 
addrListView.editIView != null)
{
// 按下和鬆開絕對值差當大於20時顯示刪除按鈕,否則不顯示
if (Math.abs(x - ux) > 20)
{
addrListView.delBtn.setVisibility(View.VISIBLE);
addrListView.editIView.setVisibility(View.VISIBLE);
curDel_btn = addrListView.delBtn;
curEdit_Img = addrListView.editIView;
}
}
}
return true;
}
});

addrListView.delBtn.setOnClickListener(new OnClickListener() {
private int position;

@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
int vid = v.getId();
AddrListView holder = getViewHolder(v);  
this.position = holder.position;
infoActivity.myAddr.delAddr(addrInfos.addrInfoList.get(position).id);
Toast.makeText(infoActivity, "id:"+addrInfos.addrInfoList.get(position).id, Toast.LENGTH_SHORT).show();
}
});
addrListView.editIView.setOnClickListener(new OnClickListener() {

private int position;
@Override
public void onClick(View v)
{
int vid = v.getId();
AddrListView holder = getViewHolder(v);  
this.position = holder.position;
infoActivity.showEditAddr(addrInfos.addrInfoList.get(position));
Toast.makeText(infoActivity, "position:"+position, Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
/*
* 獲取view返回對應自定listview 然後進行比較
*/
public AddrListView getViewHolder(View v){  
 if (v.getTag() == null){  
   return getViewHolder((View) v.getParent());  
 }  
 return (AddrListView) v.getTag();  
}

}

     整個功能下來,原理就是,adapter在獲取要顯示的view的時候利用自定義的view中一個變數暫存position,然後再提取view的時候根據view的獲取對應的自定義listview,最後獲取自定義listview中的position。