java - 如何将房间数据库中的列表数据添加到android中的警报对话框
问题描述
我正在使用 Room 数据库,我想从 Category 表中检索数据并在警报对话框中显示它
final List<Category> categories = database.getQuery().getByCategory("Income");
但它显示如下错误:
error: no suitable method found for setItems(List<Category>,<anonymous android.content.DialogInterface.OnClickListener>)
method Builder.setItems(int,android.content.DialogInterface.OnClickListener) is not applicable
(argument mismatch; List<Category> cannot be converted to int)
method Builder.setItems(CharSequence[],android.content.DialogInterface.OnClickListener) is not applicable
(argument mismatch; List<Category> cannot be converted to CharSequence[])
package com.example.mybugetssimple;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import com.example.mybugetssimple.database.Category;
import com.example.mybugetssimple.database.ExpenseDatabase;
import com.google.android.material.snackbar.Snackbar;
import java.util.List;
public class AddExpenseActivity extends AppCompatActivity{
TextView Date,catType;
EditText amount,desc;
ExpenseDatabase database;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_expense);
//Add back Button
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
catType = findViewById(R.id.addExInputTv);
Date =findViewById(R.id.addExDateInputTv);
amount = findViewById(R.id.addExAmountInputEt);
desc = findViewById(R.id.addExDesInputEt);
database = ExpenseDatabase.getDatabaseInstance(this);
final List<Category> categories = database.getQuery().getByCategory("Income");
System.out.println(categories);
catType.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
final AlertDialog.Builder builder = new AlertDialog.Builder(AddExpenseActivity.this);
builder.setTitle( "Select Income Category" );
builder.setItems( categories, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
catType.setText(categories.get(which).getCategory_name());
}
} );
builder.setNegativeButton( "CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
builder.setCancelable( true );
}
} );
builder.setPositiveButton( "OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == -1) {
} else {
catType.setText( categories.get(which).getCategory_name());
}
}
} );
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
} );
}
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if(id == android.R.id.home){
this.finish();
}
return super.onOptionsItemSelected(item);
}
}
doa文件:
package com.example.mybugetssimple.database;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import java.util.List;
@Dao
public interface QueryDao {
@Insert
void category(Category ob);
@Insert
void category(Category...ob);
@Insert
void expense(Expense ob);
@Insert
void expense(Expense...ob);
@Insert
void income(Income ob);
@Insert
void income(Income...ob);
@Insert
void register(Register ob);
@Insert(onConflict = OnConflictStrategy.IGNORE)
void registerUser(Register ob);
@Query("SELECT * FROM Category")
LiveData<List<Category>> getAllCategoryList();
@Query("SELECT * FROM EXPENSE")
List<Expense> getAllExpenseList();
@Query("SELECT * FROM INCOME")
List<Income> getAllIncomeLIst();
@Query("SELECT * FROM REGISTER WHERE Email=:emailId and password=:passwordId")
Register getUser(String emailId, String passwordId);
@Query("SELECT *FROM Register")
List<Register> getUser();
@Query("SELECT Email FROM REGISTER WHERE Email =:emailId")
Register getEmail(String emailId);
@Query("SELECT category_id, category_name FROM CATEGORY WHERE category_type =:catType")
List<Category> getByCategory(String catType);
}
//
解决方案
Afaik setItems 接收一个字符串数组。因此,您应该生成包含类别名称的 String[] catNames,并将其与 setItems 一起使用。
用户按下确定后,您应该寻找一个以 category_name 作为在对话框中选择的类别。
final AlertDialog.Builder builder = new AlertDialog.Builder(AddExpenseActivity.this);
builder.setTitle( "Select Income Category" );
String[] catNames = new String[categories.size()];
for (int i=0; i<categories.size(); i++ ){
catNames[i] = categories.get(i).getName();
}
builder.setItems( catNames, new DialogInterface.OnClickListener() {....
推荐阅读
- java - 使用 concurrentHashMap 与 Hashmap
- javascript - 为什么particle.js 高度没有扩大?
- hyperlink - CSS去除头像图片下方的超链接
- c - raw socket 使用 epoll 没有收到 ack 包
- elasticsearch - 我们可以将 Kibana 可视化集成到我们的商业产品中吗?
- android - 一个意料之外的问题发生了。请稍后再试。(738369013) 提交到 Google Play 商店时
- android - 如何在视图寻呼机android中从另一个片段更新一个片段?
- html - 相对于其父级定位 div
- java - 有没有办法在 Java 小程序中获取 HttpOnly cookie 数据?
- ios - 如何识别或匹配两个图像?