由浅入深理解Android中的回调机制(二)【实现简易购物车功能】

来源:互联网 发布:魔法王座神器升级数据 编辑:程序博客网 时间:2024/05/20 13:09

上篇文章介绍了接口回调和Android中回调机制的应用,对接口回调也有了一个较深的认识。在此基础上今天用接口回调的知识来完成一个简易的购物车功能(重点是接口回调,不是购物车哦)。
先来看图吧
这里写图片描述
上图中商品列表其实是一个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;}

源码下载

0 1
原创粉丝点击