说明:最近碰到一个需求,用算法手写一个房贷计算器,包括等额本金和等额本息,花了一天实现了这个功能,源码全部贴出来了,计算公式也在代码里,需要请自取
icon:
step1:
package com.example.myapplication; import android.view.View; import androidx.recyclerview.widget.RecyclerView; public abstract class BaseRecyclerViewAdapterextends RecyclerView.Adapter implements View.OnClickListener, View.OnLongClickListener { private OnItemClickListener onItemClickListener; private OnItemLongClickListener onItemLongClickListener; @Override public void onBindViewHolder(VH holder, int position) { holder.itemView.setTag(position); holder.itemView.setOnClickListener(this); holder.itemView.setOnLongClickListener(this); } @Override public void onClick(View v) { if (onItemClickListener != null) { onItemClickListener.onItemClick((Integer) v.getTag()); } } @Override public boolean onLongClick(View v) { if (onItemLongClickListener != null) { return onItemLongClickListener.onLongClick((Integer) v.getTag()); } return false; } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { this.onItemLongClickListener = onItemLongClickListener; } public interface OnItemClickListener { void onItemClick(int position); } public interface OnItemLongClickListener { boolean onLongClick(int position); } }
step2:
package com.example.myapplication; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.List; import androidx.recyclerview.widget.RecyclerView; public class GroupInfoAdapter extends BaseRecyclerViewAdapter{ private Context mContext; private List mGroups; private boolean enable; public GroupInfoAdapter(Context context, List groups) { this.mContext = context; this.mGroups = groups; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_device_group, parent, false); ViewHolder holder = new ViewHolder(itemView); holder.tv_id = (TextView) itemView.findViewById(R.id.tv_id); holder.tv_all = (TextView) itemView.findViewById(R.id.tv_all); holder.tv_year_factor = (TextView) itemView.findViewById(R.id.tv_year_factor); holder.tv_month_factor = (TextView) itemView.findViewById(R.id.tv_month_factor); holder.tv_year_int = (TextView) itemView.findViewById(R.id.tv_year_int); holder.tv_month_int = (TextView) itemView.findViewById(R.id.tv_month_int); holder.tv_li_month = (TextView) itemView.findViewById(R.id.tv_li_month); holder.tv_ben_month = (TextView) itemView.findViewById(R.id.tv_ben_month); holder.tv_all_month = (TextView) itemView.findViewById(R.id.tv_all_month); holder.tv_java_money = (TextView) itemView.findViewById(R.id.tv_java_money); holder.tv_remain_money = (TextView) itemView.findViewById(R.id.tv_remain_money); holder.tv_time = (TextView) itemView.findViewById(R.id.tv_time); holder.tv_all_money = (TextView) itemView.findViewById(R.id.tv_all_money); return holder; } @Override public int getItemCount() { return mGroups == null ? 0 : mGroups.size(); } @Override public void onBindViewHolder(ViewHolder holder, int position) { super.onBindViewHolder(holder, position); LoanBean group = mGroups.get(position); holder.tv_id.setText(String.valueOf(group.getId())); holder.tv_all.setText(String.format("%.2f", group.getAll())); holder.tv_year_factor.setText(String.format("%.3f", group.getYearFactor())); holder.tv_month_factor.setText(String.format("%.3f", group.getMonthFactor())); holder.tv_year_int.setText(String.format("%.2f", group.getYearInt())); holder.tv_month_int.setText(String.format("%.2f", group.getMonthInt())); holder.tv_li_month.setText(String.format("%.2f", group.getLiMonth())); holder.tv_ben_month.setText(String.format("%.2f", group.getBenMonth())); holder.tv_all_month.setText(String.format("%.2f", group.getAllMonth())); holder.tv_remain_money.setText(String.format("%.2f", group.getRemainMoney())); holder.tv_java_money.setText(String.format("%.2f", group.getJavaMoney())); holder.tv_time.setText(group.getTime(group.getYear(),group.getMonth(),group.getDay())); holder.tv_all_money.setText(String.format("%.2f", group.getAllMoney())); } class ViewHolder extends RecyclerView.ViewHolder { TextView tv_id, tv_all, tv_year_factor, tv_month_factor, tv_year_int, tv_month_int, tv_li_month, tv_ben_month, tv_all_month, tv_remain_money, tv_java_money,tv_time,tv_all_money; public ViewHolder(View itemView) { super(itemView); } } }
step3:
package com.example.myapplication;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.widget.NestedScrollView;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
public class HelloActivity extends FragmentActivity {
double all = 0;
double yearFactor = 0;
double monthFactor = 0;
double yearInt = 0;
double monthInt = 0;
double liMonth = 0;
double benMonth = 0;
double allMonth = 0;
double remainMoney = 0;
double javaMoney = 0;
private HashMap map;
private GroupInfoAdapter mAdapter;
private RecyclerView rv_group;
private List list;
private EditText et_year_factor;
private EditText et_all;
private EditText et_year_int;
private Button btn_search, btn_search2;
private EditText et_year;
private EditText et_month;
private EditText et_day;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
map = new HashMap<>();
list = new ArrayList<>();
all = 1000000;
yearFactor = 0.06;
monthFactor = yearFactor / 12;
yearInt = 30;
monthInt = yearInt * 12;
liMonth = remainMoney * monthFactor;
benMonth = remainMoney / monthInt;
allMonth = liMonth + benMonth;
remainMoney = all - javaMoney;
for (int i = 0; i < monthInt; i++) {
map.put(i, new LoanBean(i, all, ((monthInt+1)*all*monthFactor)/2+all,yearFactor, monthFactor, yearInt, monthInt,
(all - ((remainMoney / monthInt) * (i + 1))) * monthFactor,
remainMoney / monthInt,
(all - ((remainMoney / monthInt) * (i + 1))) * monthFactor + remainMoney / monthInt,
all - ((remainMoney / monthInt) * (i + 1)),
(remainMoney / monthInt) * (i + 1),
(i + 8) / 12 + 2022,
(i + 8) % 12,
9));
}
System.out.println(map);
if (!list.isEmpty()) {
list.clear();
}
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
list.add(map.get(iter.next()));
}
rv_group = findViewById(R.id.rv_group);
et_year_factor = findViewById(R.id.et_year_factor);
et_all = findViewById(R.id.et_all);
et_year_int = findViewById(R.id.rt_year_int);
btn_search = findViewById(R.id.btn_search);
btn_search2 = findViewById(R.id.btn_search2);
et_year = findViewById(R.id.et_year);
et_month = findViewById(R.id.et_month);
et_day = findViewById(R.id.et_day);
mAdapter = new GroupInfoAdapter(HelloActivity.this, list);
rv_group.setLayoutManager(new LinearLayoutManager(HelloActivity.this));
rv_group.setAdapter(mAdapter);
btn_search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String etYearFactorString = et_year_factor.getText().toString();
String etAllString = et_all.getText().toString();
String etYearIntString = et_year_int.getText().toString();
String currentYear = et_year.getText().toString();
String currentMonth = et_month.getText().toString();
String currentDay = et_day.getText().toString();
all = Double.parseDouble(etAllString) * 10000;
yearFactor = Double.parseDouble(etYearFactorString) / 100;
monthFactor = yearFactor / 12;
yearInt = Double.parseDouble(etYearIntString);
monthInt = yearInt * 12;
liMonth = remainMoney * monthFactor;
benMonth = remainMoney / monthInt;
allMonth = liMonth + benMonth;
remainMoney = all - javaMoney;
for (int i = 0; i < monthInt; i++) {
map.put(i, new LoanBean(i, all, ((monthInt+1)*all*monthFactor)/2+all,yearFactor, monthFactor, yearInt,
monthInt, (all - ((remainMoney / monthInt) * (i + 1))) * monthFactor, remainMoney / monthInt,
(all - ((remainMoney / monthInt) * (i + 1))) * monthFactor + remainMoney / monthInt,
all - ((remainMoney / monthInt) * (i + 1)),
(remainMoney / monthInt) * (i + 1),
(i + Integer.parseInt(currentMonth)) / 12 + Integer.parseInt(currentYear),
(i + Integer.parseInt(currentMonth)) % 12,
Integer.parseInt(currentDay)));
}
System.out.println(map);
if (!list.isEmpty()) {
list.clear();
}
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
list.add(map.get(iter.next()));
}
mAdapter.notifyDataSetChanged();
}
});
btn_search2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String etYearFactorString = et_year_factor.getText().toString();
String etAllString = et_all.getText().toString();
String etYearIntString = et_year_int.getText().toString();
String currentYear = et_year.getText().toString();
String currentMonth = et_month.getText().toString();
String currentDay = et_day.getText().toString();
all = Double.parseDouble(etAllString) * 10000;
yearFactor = Double.parseDouble(etYearFactorString) / 100;
monthFactor = yearFactor / 12;
yearInt = Double.parseDouble(etYearIntString);
monthInt = yearInt * 12;
liMonth = remainMoney * monthFactor;
benMonth = remainMoney / monthInt;
allMonth = liMonth + benMonth;
remainMoney = all - javaMoney;
for (int i = 0; i < monthInt; i++) {
map.put(i, new LoanBean(i, all,
(all * (yearFactor / 12) * Math.pow((yearFactor / 12 + 1), 360) / (Math.pow((yearFactor / 12 + 1), 360) - 1))*monthInt,
yearFactor, monthFactor, yearInt,
monthInt,
all * monthFactor,
all * monthFactor * Math.pow((monthFactor + 1), monthInt) / (Math.pow((monthFactor + 1), monthInt) - 1) - all * monthFactor,
all * monthFactor * Math.pow((monthFactor + 1), monthInt) / (Math.pow((monthFactor + 1), monthInt) - 1),
all - (all * monthFactor * Math.pow((monthFactor + 1), monthInt) / (Math.pow((monthFactor + 1), monthInt) - 1) - all * monthFactor) * (i + 1),
(all * monthFactor * Math.pow((monthFactor + 1), monthInt) / (Math.pow((monthFactor + 1), monthInt) - 1) - all * monthFactor) * (i + 1),
(i + Integer.parseInt(currentMonth)) / 12 + Integer.parseInt(currentYear),
(i + Integer.parseInt(currentMonth)) % 12,
Integer.parseInt(currentDay)));
}
System.out.println(map);
if (!list.isEmpty()) {
list.clear();
}
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
list.add(map.get(iter.next()));
}
mAdapter.notifyDataSetChanged();
}
});
}
}
step4:
package com.example.myapplication;
public class LoanBean {
private int id;
private double all;
private double allMoney;
private double yearFactor;
private double monthFactor;
private double yearInt;
private double monthInt;
private double liMonth;
private double benMonth;
private double allMonth;
private double remainMoney;
private double javaMoney;
private int year;
private int month;
private int day;
public LoanBean(int id, double all, double allMoney, double yearFactor, double monthFactor, double yearInt, double monthInt, double liMonth, double benMonth, double allMonth, double remainMoney, double javaMoney, int year, int month,int day) {
this.id = id;
this.all = all;
this.allMoney = allMoney;
this.yearFactor = yearFactor;
this.monthFactor = monthFactor;
this.yearInt = yearInt;
this.monthInt = monthInt;
this.liMonth = liMonth;
this.benMonth = benMonth;
this.allMonth = allMonth;
this.remainMoney = remainMoney;
this.javaMoney = javaMoney;
this.year = year;
this.month = month;
this.day = day;
}
public double getAllMoney() {
return allMoney;
}
public void setAllMoney(double allMoney) {
this.allMoney = allMoney;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getAll() {
return all;
}
public void setAll(double all) {
this.all = all;
}
public double getYearFactor() {
return yearFactor;
}
public void setYearFactor(double yearFactor) {
this.yearFactor = yearFactor;
}
public double getMonthFactor() {
return monthFactor;
}
public void setMonthFactor(double monthFactor) {
this.monthFactor = monthFactor;
}
public double getYearInt() {
return yearInt;
}
public void setYearInt(double yearInt) {
this.yearInt = yearInt;
}
public double getMonthInt() {
return monthInt;
}
public void setMonthInt(double monthInt) {
this.monthInt = monthInt;
}
public double getLiMonth() {
return liMonth;
}
public void setLiMonth(double liMonth) {
this.liMonth = liMonth;
}
public double getBenMonth() {
return benMonth;
}
public void setBenMonth(double benMonth) {
this.benMonth = benMonth;
}
public double getAllMonth() {
return allMonth;
}
public void setAllMonth(double allMonth) {
this.allMonth = allMonth;
}
public double getRemainMoney() {
return remainMoney;
}
public void setRemainMoney(double remainMoney) {
this.remainMoney = remainMoney;
}
public double getJavaMoney() {
return javaMoney;
}
public void setJavaMoney(double javaMoney) {
this.javaMoney = javaMoney;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public String getTime(int year, int month,int day) {
if (month==0){
month=12;
}
return year+"年"+month+"月"+day+"日";
}
}
step5:
step6:
end



