Android实用技巧.列表技巧(二).itemClick
2016-12-23 15:41
369 查看
当list页每一个item有多个点击事件,并且逻辑处理需要在activity中时,就需要把点击事件传递到activity中。
![](https://img-blog.csdn.net/20161223154048470?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZDI3NjAzMTAzNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
有两种方式:委托模式和反射机制
下边具体例子:
adapter:
接口监听:
创建接口
反射监听:
把activity类传到adapter中,通过反射机制调用类中的方法
有两种方式:委托模式和反射机制
下边具体例子:
创建列表页
public class ListListenerActivity extends Activity implements ItemClickListener{ ListView listView; private ListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_animation_controller); listView = (ListView)findViewById(R.id.listView); List<String> list = new ArrayList<>(); list.add("页面1"); list.add("页面2"); list.add("页面3"); list.add("页面4"); list.add("页面5"); list.add("页面6"); list.add("页面7"); list.add("页面8"); list.add("页面9"); list.add("页面10"); adapter = new ListAdapter(this,ListListenerActivity.this,list,this); listView.setAdapter(adapter); } @Override public void itemClickListener(int idx) { toastText(idx); } public void toastText(Integer idx){ Toast.makeText(this,"接口调用监听"+idx,Toast.LENGTH_SHORT).show(); } public void toastText2(Integer idx){ Toast.makeText(this,"反射调用监听"+idx,Toast.LENGTH_SHORT).show(); } }
adapter:
/** * Created by Dujq on 2016/12/23. */ public class ListAdapter extends BaseAdapter { private Context ctx; private Object object; private List<String> list; private LayoutInflater mInflater; private ItemClickListener itemListener; public ListAdapter(Context ctx, Object object, List<String> list,ItemClickListener itemListener){ this.ctx = ctx; this.list = list; this.object = object; this.itemListener = itemListener; this.mInflater = LayoutInflater.from(ctx); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(final int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; if (view == null) { viewHolder = new ViewHolder(); view = mInflater.inflate(R.layout.item_textview, null); viewHolder.textView = (TextView) view .findViewById(R.id.text); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } viewHolder.textView.setText(list.get(i)==null?"":list.get(i)); viewHolder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(i%2==0){ reflectMethod(i); }else{ itemListener.itemClickListener(i); } } }); return view; } /** * 反射调用委托方法 */ public void reflectMethod(Integer idx) { Method cMethod; try { cMethod = object .getClass() .getMethod( "toastText2", new Class[] { Class.forName("java.lang.Integer") }); cMethod.invoke(object, idx); } catch (Exception e) { e.printStackTrace(); } } public final class ViewHolder{ TextView textView; } public Context getCtx() { return ctx; } public void setCtx(Context ctx) { this.ctx = ctx; } public Object getObject() { return object; } public void setObject(Object object) { this.object = object; } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } }
接口监听:
创建接口
/** * Created by Dujq on 2016/12/23. */ public interface ItemClickListener { void itemClickListener(int idx); }在acrivity中实现,然后传到adapter中调用即可
反射监听:
把activity类传到adapter中,通过反射机制调用类中的方法
/** * 反射调用委托方法 */ public void reflectMethod(Integer idx) { Method cMethod; try { cMethod = object .getClass() .getMethod( "toastText2", new Class[] { c074 Class.forName("java.lang.Integer") }); cMethod.invoke(object, idx); } catch (Exception e) { e.printStackTrace(); } }
相关文章推荐
- Glide 加载GIF
- android进阶篇之引导页系列之viewpager实现Animation动画效果
- Android Studio 常见异常解决办法
- Android 7.0 ActivityManagerService(6) Service相关流程分析
- Android 多渠道打包 gradle部分,如何处理代码混淆问题
- Android Studio 解决错误 Could not find method android() for arguments
- Android 判断获取的时间是否是今天、昨天
- Android实践异常记录self
- Android 6.0 scrollview 嵌套recyclerview不能全部显示,高度不正常的问题
- Android中OrmLite数据库使用总结
- 彻底理解android中的内部存储与外部存储
- CMD命令 chmod 666/777/744 的含义
- Android常见问题及开发经验总结(四)
- Android KeyCode列表
- android 区分wifi是5G还是2.4G
- android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParam
- android 区分wifi是5G还是2.4G
- Android进阶系列之源码分析Activity的启动流程
- Android NDK 编译出现 atomic :No such file or directory
- android小游戏 扫雷