在android 項目中,我們經常用到OnClickListenr這個監聽器類,一般情況下,這些監聽事件沒有什麼複用性,大部分只是臨時使用一次,所以我們可以將它定義爲匿名內部類。
有時候我們在從事android項目開發時,如果一個activity中有好幾個控件有點擊監聽,可能要寫好幾次new OnClickListner(),所以,爲了減少代碼重複量,我們可以將這個匿名內部類提取出來。
這種用法還可以對adapter中的子項的任一控件添加監聽,如下,這樣,我們可以將所有監聽放在Activtity中的這個匿名內部類內統一處理。這種寫法還有個好處,因爲是內部類,內部類成員可以直接訪問外部類的私有數據,所以可以能讓adapter裏的監聽事件訪問activity中這個外部類的所有界面組件。
代碼如下 Activty
public class MainActivity extends Activity {
private MainAdapter mMainAdapter;
private ListView mListView;
private ArrayList<People> mDataList = new ArrayList<People>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.ls_main);
mMainAdapter = new MainAdapter(this, mOnClick);
initData();
mMainAdapter.setData(mDataList);
mListView.setAdapter(mMainAdapter);
}
//匿名內部類監聽器
private OnClickListener mOnClick = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_click:
//可以獲取子項的位置,可以在這裏處理監聽事件,可訪問activi/ty中的所有私有屬性
int position = (Integer) v.getTag(R.id.btn_click);
Toast.makeText(MainActivity.this, "你點擊了" + position, Toast.LENGTH_LONG).show();
break;
}
}
};
private void initData() {
People people = null;
for (int i = 0; i < 10; i++) {
people = new People();
people.setName(i + "");
mDataList.add(people);
}
}
}
佈局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/ls_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
adapter
public class MainAdapter extends BaseAdapter {
private OnClickListener listener;
private LayoutInflater inflater;
private ArrayList<People> peopleDatas = new ArrayList<People>();
public MainAdapter(Context context, OnClickListener listener) {
this.listener = listener;
this.inflater = LayoutInflater.from(context);
}
public void setData(ArrayList<People> data) {
if (null == data)
return;
peopleDatas.clear();
People people;
int size = data.size();
for (int i = 0; i < size; i++) {
people = data.get(i);
peopleDatas.add(people);
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return peopleDatas.size();
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_main, null);
viewHolder.tvName = (TextView) convertView.findViewById(R.id.tv_name);
viewHolder.btnClick = (Button) convertView.findViewById(R.id.btn_click);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (position < peopleDatas.size()) {
People people = peopleDatas.get(position);
if (null != people) {
viewHolder.btnClick.setTag(R.id.btn_click, position);
viewHolder.btnClick.setOnClickListener(listener);
viewHolder.tvName.setText(people.getName());
}
}
return convertView;
}
class ViewHolder {
TextView tvName;
Button btnClick;
}
}
listView的子佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:layout_weight="1"
android:text="sfsf"/>
<Button
android:id="@+id/btn_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fvsdvsd"/>
</LinearLayout>