用Android写一个记账本,实现记账软件的基本功能,并将记账的结果保存到Android本地数据库,并且功能中至少需要包含recycleview控件显示所有的记账条目,fragment
时间: 2024-05-10 12:18:28 浏览: 11
好的,我可以为您提供一些实现步骤和代码示例。
1. 首先,您需要创建一个新的Android项目,并添加以下依赖项:
```java
dependencies {
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.fragment:fragment:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
}
```
2. 接下来,创建一个MainActivity和一个布局文件activity_main.xml。在布局文件中,添加一个FloatingActionButton和一个FrameLayout,用于显示Fragment。
```xml
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:src="@drawable/ic_add"
app:backgroundTint="@color/colorPrimaryDark" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
```
3. 创建一个Fragment用于显示记账的列表,并添加一个布局文件fragment_list.xml。在布局文件中,添加一个RecyclerView。
```xml
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
4. 创建一个类来表示记账的条目:
```java
public class Expense {
private String title;
private double amount;
private Date date;
public Expense(String title, double amount, Date date) {
this.title = title;
this.amount = amount;
this.date = date;
}
public String getTitle() {
return title;
}
public double getAmount() {
return amount;
}
public Date getDate() {
return date;
}
}
```
5. 创建一个ExpenseAdapter类来管理RecyclerView中的数据项。这个类需要继承RecyclerView.Adapter,并实现一些必要的方法。
```java
public class ExpenseAdapter extends RecyclerView.Adapter<ExpenseAdapter.ViewHolder> {
private List<Expense> expenses;
public ExpenseAdapter(List<Expense> expenses) {
this.expenses = expenses;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item_expense, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Expense expense = expenses.get(position);
holder.titleTextView.setText(expense.getTitle());
holder.amountTextView.setText(String.format(Locale.getDefault(), "%.2f", expense.getAmount()));
holder.dateTextView.setText(new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(expense.getDate()));
}
@Override
public int getItemCount() {
return expenses.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView titleTextView;
public TextView amountTextView;
public TextView dateTextView;
public ViewHolder(View itemView) {
super(itemView);
titleTextView = itemView.findViewById(R.id.text_view_title);
amountTextView = itemView.findViewById(R.id.text_view_amount);
dateTextView = itemView.findViewById(R.id.text_view_date);
}
}
}
```
6. 在fragment_list.xml中,添加一个list_item_expense.xml布局文件,用于显示Expense对象的属性。
```xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<TextView
android:id="@+id/text_view_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Title"
android:textAppearance="?android:textAppearanceMedium" />
<TextView
android:id="@+id/text_view_amount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Amount"
android:textAppearance="?android:textAppearanceMedium" />
<TextView
android:id="@+id/text_view_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Date"
android:textAppearance="?android:textAppearanceMedium" />
</LinearLayout>
```
7. 在MainActivity中,实现FloatingActionButton的点击事件,并显示Fragment。
```java
public class MainActivity extends AppCompatActivity {
private FloatingActionButton fabAdd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fabAdd = findViewById(R.id.fab_add);
fabAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showAddExpenseFragment();
}
});
showExpenseListFragment();
}
private void showExpenseListFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment_container, new ExpenseListFragment());
transaction.commit();
}
private void showAddExpenseFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment_container, new AddExpenseFragment());
transaction.addToBackStack(null);
transaction.commit();
}
}
```
8. 创建一个ExpenseListFragment类来显示Expense列表。
```java
public class ExpenseListFragment extends Fragment {
private RecyclerView recyclerView;
private ExpenseAdapter adapter;
private List<Expense> expenses;
public ExpenseListFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
expenses = new ArrayList<>();
expenses.add(new Expense("Food", 30.0, new Date()));
expenses.add(new Expense("Transportation", 10.0, new Date()));
expenses.add(new Expense("Entertainment", 50.0, new Date()));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list, container, false);
recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new ExpenseAdapter(expenses);
recyclerView.setAdapter(adapter);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_expense_list, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add:
((MainActivity) getActivity()).showAddExpenseFragment();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
```
9. 创建一个AddExpenseFragment来添加新的Expense条目。
```java
public class AddExpenseFragment extends Fragment {
public AddExpenseFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_expense, container, false);
//TODO: Add UI elements and logic for adding a new expense
return view;
}
}
```
10. 最后,您可以使用Android本地数据库来保存Expense对象。这里只是一个简单的示例:
```java
public void addExpense(Expense expense) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("title", expense.getTitle());
values.put("amount", expense.getAmount());
values.put("date", expense.getDate().getTime());
db.insert("expenses", null, values);
db.close();
}
public List<Expense> getExpenses() {
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.query("expenses", null, null, null, null, null, null);
List<Expense> expenses = new ArrayList<>();
while (cursor.moveToNext()) {
String title = cursor.getString(cursor.getColumnIndex("title"));
double amount = cursor.getDouble(cursor.getColumnIndex("amount"));
long dateMillis = cursor.getLong(cursor.getColumnIndex("date"));
expenses.add(new Expense(title, amount, new Date(dateMillis)));
}
cursor.close();
db.close();
return expenses;
}
```
以上是一个简单的记账本应用程序的实现步骤和示例代码。当然,这只是一个简单的示例,您可以在此基础上进一步扩展和改进您的应用程序。