您的位置:首页 > 移动开发 > Android开发

由浅入深理解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重写的两个方法中去实现我们想要完成的事情。

如果没看懂思路没关系,下面用代码说话。

定义一个接口,接口里边包含两个抽象方法,分别负责增加和减少商品数量。

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;
}


源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息