由浅入深理解Android中的回调机制(二)【实现简易购物车功能】
2016-07-28 14:08
721 查看
上篇文章介绍了接口回调和Android中回调机制的应用,对接口回调也有了一个较深的认识。在此基础上今天用接口回调的知识来完成一个简易的购物车功能(重点是接口回调,不是购物车哦)。
先来看图吧
上图中商品列表其实是一个ListView,由于只是演示接口回调的应用,所以只在ListView中填充了一条数据。而最下边的结算一栏是在ListView的外部,那么当商品数量改变时结算总价必然会跟随变化,也就是下边的结算会随着点击加号或者减号而变化。
做过item的子控件的点击事件的小伙伴应该清楚,item中子控件的点击事件是在Adapter中完成的(点此查看文章item子控件的点击事件),那么在ListView中点击子控件控件如何将得到的结果显示到ListView外部呢?即商品数量改变了,如何将总价格更新到ListView外部的结算出?其实就可以用接口回调来完成。
接下来看实现思路。
(1.)首先我们可以定义一个接口,接口里边包含两个抽象方法,分别负责增加和减少商品数量。
(2.)接下来让MainActivity实现该接口并重写两个方法。
(3.)然后可以在Adapter类中声明一个接口的引用,并给“+”和“-”各设置一个监听事件,当“+”被点击的时候我们用接口去调用增加商品的方法,同理,当“-”被点击的时候我们通过接口取调用减少商品的方法。而通过接口去调用这两个方法其实是回调到了MainActivity中,所以我们就可以在MainActivity重写的两个方法中去实现我们想要完成的事情。
如果没看懂思路没关系,下面用代码说话。
定义一个接口,接口里边包含两个抽象方法,分别负责增加和减少商品数量。
MainActivity实现该接口并重写接口中的两个方法
Adapter类中声明一个接口的引用,并给“+”和“-”各设置一个监听事件,在监听事件中执行回调方法。
ListView对应的ViewHolder类
源码下载
先来看图吧
上图中商品列表其实是一个ListView,由于只是演示接口回调的应用,所以只在ListView中填充了一条数据。而最下边的结算一栏是在ListView的外部,那么当商品数量改变时结算总价必然会跟随变化,也就是下边的结算会随着点击加号或者减号而变化。
做过item的子控件的点击事件的小伙伴应该清楚,item中子控件的点击事件是在Adapter中完成的(点此查看文章item子控件的点击事件),那么在ListView中点击子控件控件如何将得到的结果显示到ListView外部呢?即商品数量改变了,如何将总价格更新到ListView外部的结算出?其实就可以用接口回调来完成。
接下来看实现思路。
(1.)首先我们可以定义一个接口,接口里边包含两个抽象方法,分别负责增加和减少商品数量。
(2.)接下来让MainActivity实现该接口并重写两个方法。
(3.)然后可以在Adapter类中声明一个接口的引用,并给“+”和“-”各设置一个监听事件,当“+”被点击的时候我们用接口去调用增加商品的方法,同理,当“-”被点击的时候我们通过接口取调用减少商品的方法。而通过接口去调用这两个方法其实是回调到了MainActivity中,所以我们就可以在MainActivity重写的两个方法中去实现我们想要完成的事情。
如果没看懂思路没关系,下面用代码说话。
定义一个接口,接口里边包含两个抽象方法,分别负责增加和减少商品数量。
package com.example.smily.callback; /** * Created by zhpan on 2016/7/28. * 回调接口 */ public interface SetOnNumListener { // 增加商品数量的回调方法 void onAddNumListener(int price,ViewHolder holder); //减少商品数量的回调方法 void onSubNumListener(int price,ViewHolder holder); }
MainActivity实现该接口并重写接口中的两个方法
package com.example.smily.callback; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements SetOnNumListener { ListView mListView; TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView= (ListView) findViewById(R.id.lv_main); mTextView= (TextView) findViewById(R.id.tv_main); MyAdapter adapter=new MyAdapter(this); mListView.setAdapter(adapter); } /** * 在此实现增加商品数量,并更新总价格 * @param price * @param holder */ @Override public void onAddNumListener(int price,ViewHolder holder) { String numStr = holder.num.getText().toString(); int num=Integer.parseInt(numStr); num++; holder.num.setText(num+""); int totalPrice=price*num; mTextView.setText("结算:¥"+totalPrice); } /** * 在此实现减少商品数量,并更新总价格 * @param price * @param holder */ @Override public void onSubNumListener(int price,ViewHolder holder) { String numStr = holder.num.getText().toString(); int num=Integer.parseInt(numStr); if(num>1){ num--; holder.num.setText(num+""); int totalPrice=price*num; mTextView.setText("结算:¥"+totalPrice); }else{ Toast.makeText(MainActivity.this, "不能再减少了", Toast.LENGTH_SHORT).show(); } } }
Adapter类中声明一个接口的引用,并给“+”和“-”各设置一个监听事件,在监听事件中执行回调方法。
package com.example.smily.callback; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; /** * Created by zhpan on 2016/7/28. * item中的数据并没有在getView()方法中添加,而是是在item布局文件中添加的。 */ public class MyAdapter extends BaseAdapter { Context mContext; SetOnNumListener setOnNumListener; public MyAdapter(Context mContext) { this.mContext = mContext; setOnNumListener= (SetOnNumListener) mContext; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView=View.inflate(mContext,R.layout.item,null); final ViewHolder holder=new ViewHolder(); holder.add = (TextView) convertView.findViewById(R.id.tv_item_add); holder.sub = (TextView) convertView.findViewById(R.id.tv_item_sub); holder.num = (TextView) convertView.findViewById(R.id.tv_item_num); // “+”的监听事件 holder.add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 回调方法 setOnNumListener.onAddNumListener(10, holder); } }); // “-”的监听事件 holder.sub.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 回调方法 setOnNumListener.onSubNumListener(10,holder); } }); return convertView; } @Override public int getCount() { return 1; } @Override public Object getItem(int i) { return null; } }
ListView对应的ViewHolder类
import android.widget.TextView; /** * Created by zhpan on 2016/7/28. */ public class ViewHolder { TextView sub; TextView num; TextView add; }
源码下载
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories