在Activty中处理adapter中的监听事件的写法

来源:互联网 发布:美工抠图 编辑:程序博客网 时间:2024/06/01 10:03

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




0 0
原创粉丝点击