在Activty中處理adapter中的監聽事件的寫法

     在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>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章