列表接口回掉处理点击事件

转载:https://blog.csdn.net/u013091087/article/details/50697032

当在使用ListView(或者GridView,其他类似)的时候,item的点击和item上其他控件的点击,有冲突的时候,

我们可以在适配器里对item上的其他控件进行监听事件的处理

但是有时候,需求不同,可能还有其他的小问题,接下来说一个例子


假设,MainActivity上有一个ListView,ListView的Item有文本,有按钮

点击按钮的时候,需要弹出MainActivity上创建的Dialog,并且需要获取item的postion(或者是item上的其他内容,控件)在dialog上显示,

同时,又要对dialog上的内容控件进行监听,那么需要怎么解决这个问题呢


这个时候,可以使用接口回调,可以在适配器里创建一个接口,接口里可以定义需要的抽象方法,

根据上面的假设,可以定义一个onShowDialog(),getPostion(int position);这两个方法

当然,这两个方法执行之前当然是先点击item上的按钮,这样才能触发这两个接口上的方法,所以先对按钮进行点击事件的监听

点击了,那么怎么调用这两个方法呢,我们是在MainActivity上实现接口的,我们不让MainActivity implement 接口,而是创建接口对象来实例化,

将实例化对象作为参数来构造ListView所需要的适配器,接下来写一下步骤:


1、创建自定义适配器,在适配器里创建接口,并且在接口上定义方法

2、在适配器上对item上的按钮进行监听,先不做点击后的逻辑处理(此时还没有接口对象)

3、在MainActivity上实例化适配器创建的接口,并取得接口对象

4、拿着接口对象,作为适配器的构造参数,来构造适配器,那么这个时候在适配器里拿到接口对象,回到步骤2对按钮的点击进行处理,需要获取item上的内容,最好是自定义监听类,通过构造方法取得item上的内容


以上是本人一点小小的笔记,如有不对,或是有更好的解决方法,请多多指教!下面是Demo的代码。

http://download.csdn.net/detail/u013091087/9436572


MainActivity

[java]  view plain  copy
  1. package com.jiaui.interfacecallbackdemo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import com.jiaui.interfacecallbackdemo.MyAdapter.IDialogControl;  
  7.   
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.widget.ListView;  
  11. import android.widget.Toast;  
  12.   
  13. public class MainActivity extends Activity {  
  14.   
  15.     private ListView mListView;  
  16.   
  17.     private MyAdapter mAdapter;  
  18.   
  19.     /** 
  20.      * 实现本地歌曲适配器了的接口,要获取实例对象, 
  21.      * 在实例化适 配器的时候,把dialogControl对象作为参数,在适配器里就可以操作本类里实例的对象 
  22.      * 也可以将适配器里的参数返回给本类 
  23.      */  
  24.     private IDialogControl dialogControl = new IDialogControl() {  
  25.   
  26.         @Override  
  27.         public void onShowDialog() {  
  28.             // TODO Auto-generated method stub  
  29.             Toast.makeText(MainActivity.this"这里就不创建dialog了,明白意思意思一下就好了"0).show();  
  30.         }  
  31.   
  32.         @Override  
  33.         public void getPosition(int position) {  
  34.             // TODO Auto-generated method stub  
  35.             Toast.makeText(MainActivity.this"dialog拿到了position=" + position, 0).show();  
  36.         }  
  37.     };  
  38.   
  39.     @Override  
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.activity_main);  
  43.   
  44.         List<String> datalist = new ArrayList<>();  
  45.         datalist.add("你好");  
  46.         datalist.add("希望");  
  47.         datalist.add("demo");  
  48.         datalist.add("可以");  
  49.         datalist.add("对你");  
  50.         datalist.add("有帮助!");  
  51.   
  52.         mListView = (ListView) findViewById(R.id.list);  
  53.         //把dialogControl对象作为参数,在适配器里就可以操作本类里实例的对象  
  54.         mAdapter = new MyAdapter(this, dialogControl, datalist);  
  55.         mListView.setAdapter(mAdapter);  
  56.   
  57.     }  
  58. }  


适配器

可以在接口内的onClick方法中加一个判断,用来处理不同的点击事件,当然,跟条目点击事件是互不影响的。

[java]  view plain  copy
  1. package com.jiaui.interfacecallbackdemo;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseAdapter;  
  11. import android.widget.Button;  
  12. import android.widget.TextView;  
  13.   
  14. public class MyAdapter extends BaseAdapter {  
  15.   
  16.     private LayoutInflater inflater;  
  17.   
  18.     private IDialogControl dialogControl;  
  19.   
  20.     private List<String> datalist;// 数据  
  21.   
  22.     public MyAdapter(Context context, IDialogControl dialogControl, List<String> datalist) {  
  23.         // TODO Auto-generated constructor stub  
  24.         inflater = LayoutInflater.from(context);  
  25.         this.dialogControl = dialogControl;  
  26.         this.datalist = datalist;  
  27.     }  
  28.   
  29.     @Override  
  30.     public int getCount() {  
  31.         // TODO Auto-generated method stub  
  32.         return datalist.size();  
  33.     }  
  34.   
  35.     @Override  
  36.     public Object getItem(int position) {  
  37.         // TODO Auto-generated method stub  
  38.         return datalist.get(position);  
  39.     }  
  40.   
  41.     @Override  
  42.     public long getItemId(int position) {  
  43.         // TODO Auto-generated method stub  
  44.         return position;  
  45.     }  
  46.   
  47.     @Override  
  48.     public View getView(int position, View convertView, ViewGroup parent) {  
  49.         // TODO Auto-generated method stub  
  50.   
  51.         ViewHolder holder;  
  52.         if (convertView == null) {  
  53.             convertView = inflater.inflate(R.layout.item, null);  
  54.             // 初始化控件  
  55.             holder = new ViewHolder(convertView);  
  56.             convertView.setTag(holder);  
  57.         } else {  
  58.             holder = (ViewHolder) convertView.getTag();  
  59.         }  
  60.   
  61.         // 设置文本内容  
  62.         holder.contentTv.setText(datalist.get(position));  
  63.         // 按钮的点击事件  
  64.         holder.mBtn.setOnClickListener(new MyListen(position));  
  65.         return convertView;  
  66.     }  
  67.   
  68.     // 用于缓存  
  69.     class ViewHolder {  
  70.   
  71.         TextView contentTv;  
  72.         Button mBtn;  
  73.   
  74.         public ViewHolder(View view) {  
  75.             contentTv = (TextView) view.findViewById(R.id.tv_content);  
  76.             mBtn = (Button) view.findViewById(R.id.btn);  
  77.         }  
  78.     }  
  79.   
  80.     private class MyListen implements OnClickListener {  
  81.   
  82.         int position;  
  83.   
  84.         public MyListen(int position) {  
  85.             // TODO Auto-generated constructor stub  
  86.             this.position = position;  
  87.         }  
  88.   
  89.         @Override  
  90.         public void onClick(View v) {  
  91.             // TODO Auto-generated method stub  
  92.             dialogControl.onShowDialog();// 显示对话框  
  93.             // 在Activity,Frangment...或者其他实例化该适配器的类里可以获取到点击的btn所在item的position,或者是其他数据  
  94.             dialogControl.getPosition(position);  
  95.         }  
  96.   
  97.     }  
  98.   
  99.     // 内部接口  
  100.     public interface IDialogControl {  
  101.         public void onShowDialog();  
  102.   
  103.         public void getPosition(int position);  
  104.     }  
  105.   
  106. }  

activity_main.xml
[html]  view plain  copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/list"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content" >  
  10.     </ListView>  
  11.   
  12. </RelativeLayout>  

item.xml

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="40dp"  
  5.     android:orientation="horizontal" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/tv_content"  
  9.         android:layout_width="0dp"  
  10.         android:layout_height="match_parent"  
  11.         android:layout_weight="1"  
  12.         android:gravity="center"  
  13.         android:text="Test" />  
  14.   
  15.     <Button  
  16.         android:id="@+id/btn"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="match_parent"  
  19.         android:text="Btn" />  
  20.   
  21. </LinearLayout>  


猜你喜欢

转载自blog.csdn.net/Liu_ser/article/details/80018617
今日推荐