如何在recyclerview中仅显示特定值的数据



我正在尝试使用SQLite数据库制作类似于存储汽车加油的日记的东西,但我不知道如何将可见数据仅限制为分配给特定汽车ID的加油。

进程如下:(我们假设数据库中有数据)

在我点击一辆特定的汽车后,我被重定向到汽车的配置文件活动,在那里我可以看到关于这辆车的更多信息。然后,在选择一个选项后"记录一次加油"。我被重定向到我之前选择的汽车的加油记录的回收视图。

问题:

我得到每一行从表"燃料"在从cars配置文件中输入列表后,但是我只想看到分配给这一辆车的加油。

这里是我在这个问题中重要的3个活动:

第一个是注册汽车列表第一项活动

第二个是汽车配置文件第二个活动

第三个是加油清单第三个活动

(加油列表上每个项目末尾的数字是我来自并添加数据的汽车的ID)

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {
private Context context;
private static final String DATABASE_NAME = "CarsList.db";
private static final int  DATABASE_VERSION = 1;
private static final String TABLE_CARS = "cars";
private static final String COLUMN_CAR_ID = "_id";
private static final String COLUMN_BRAND = "car_brand";
private static final String COLUMN_MODEL = "car_model";
private static final String COLUMN_YEAR_MADE = "car_year_made";
private static final String TABLE_FUELS = "fuels";
private static final String COLUMN_FUEL_ID = "fuel_id";
private static final String COLUMN_STATION_NAME = "station_name";
private static final String COLUMN_FUEL_TYPE = "fuel_type";
private static final String COLUMN_FUEL_AMOUNT = "fuel_amount";
private static final String COLUMN_FUEL_COST = "fuel_cost";
private static final String COLUMN_MILEAGE = "mileage";
private static final String COLUMN_FUEL_DATE = "fuel_date";
private static final String COLUMN_FUELED_CAR_ID = "fueled_car_id";
public DatabaseHelper(@Nullable Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
String query1 =
"CREATE TABLE " + TABLE_CARS +
" (" + COLUMN_CAR_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_BRAND + " TEXT, " +
COLUMN_MODEL + " TEXT, " +
COLUMN_YEAR_MADE + " INTEGER);";
String query2 =
"CREATE TABLE " + TABLE_FUELS +
" (" + COLUMN_FUEL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_STATION_NAME + " TEXT, " +
COLUMN_FUEL_TYPE + " TEXT, " +
COLUMN_FUEL_AMOUNT + " INTEGER, " +
COLUMN_FUEL_COST + " INTEGER, " +
COLUMN_MILEAGE + " INTEGER, " +
COLUMN_FUEL_DATE + " TEXT, " +
COLUMN_FUELED_CAR_ID + " INTEGER REFERENCES "+ COLUMN_CAR_ID + ");";
db.execSQL(query1);
db.execSQL(query2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " +  TABLE_CARS);
db.execSQL("DROP TABLE IF EXISTS " +  TABLE_FUELS);
onCreate(db);
}
void addCar(String brand,
String model,
int yearMade
) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COLUMN_BRAND, brand);
cv.put(COLUMN_MODEL, model);
cv.put(COLUMN_YEAR_MADE, yearMade);
long result = db.insert(TABLE_CARS, null, cv);
if (result == -1) {
Toast.makeText(context, "Failed adding new car.", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Added a new car!", Toast.LENGTH_SHORT).show();
}
}
void addFuel(String stationName,
String fuelType,
int fuelAmount,
int fuelCost,
int mileage,
String fuelDate,
String fueledCarId
) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COLUMN_STATION_NAME, stationName);
cv.put(COLUMN_FUEL_TYPE, fuelType);
cv.put(COLUMN_FUEL_AMOUNT, fuelAmount);
cv.put(COLUMN_FUEL_COST, fuelCost);
cv.put(COLUMN_MILEAGE, mileage);
cv.put(COLUMN_FUEL_DATE, fuelDate);
cv.put(COLUMN_FUELED_CAR_ID, fueledCarId);
long result = db.insert(TABLE_FUELS, null, cv);
if (result == -1) {
Toast.makeText(context, "Failed adding new refueling.", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Added a new refueling!", Toast.LENGTH_SHORT).show();
}
}
@SuppressLint("Recycle")
Cursor readAllCars() {
String query = "SELECT * FROM " + TABLE_CARS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = null;
if(db != null) {
cursor = db.rawQuery(query, null);
}
return cursor;
}
@SuppressLint("Recycle")
Cursor readAllFuels() {
String query = "SELECT * FROM " + TABLE_FUELS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = null;
if(db != null) {
cursor = db.rawQuery(query, null);
}
return cursor;
}
}

RecyclerFuelAdapter.java

public class RecyclerFuelAdapter extends RecyclerView.Adapter<RecyclerFuelAdapter.MyViewHolder> {
private ArrayList<String> fuelIds, stationNames, fuelTypes, fuelAmounts, fuelCosts, mileages, fuelDates, fueledCarIds;
private Context context;
public RecyclerViewClickListener listener;
public RecyclerFuelAdapter(Context context,
ArrayList<String> fuelIds,
ArrayList<String> stationNames,
ArrayList<String> fuelTypes,
ArrayList<String> fuelAmounts,
ArrayList<String> fuelCosts,
ArrayList<String> mileages,
ArrayList<String> fuelDates,
ArrayList<String> fueledCarIds,
RecyclerViewClickListener listener) {
this.fuelIds = fuelIds;
this.stationNames = stationNames;
this.fuelTypes = fuelTypes;
this.fuelAmounts = fuelAmounts;
this.fuelCosts = fuelCosts;
this.mileages = mileages;
this.fuelDates = fuelDates;
this.fueledCarIds = fueledCarIds;
this.context = context;
this.listener = listener;
}
@NonNull
@Override
public RecyclerFuelAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View fuelView = inflater.inflate(R.layout.list_fuel, parent, false);
return new MyViewHolder(fuelView);
}
@Override
public void onBindViewHolder(@NonNull RecyclerFuelAdapter.MyViewHolder holder, int position) {
String $fuelAmount = fuelAmounts.get(position) + "L";
String $fuelCost = fuelCosts.get(position) + "$";
holder.fuelIdTv.setText(String.valueOf(fuelIds.get(position)));
holder.fuelAmountTv.setText($fuelAmount);
holder.fuelCostTv.setText($fuelCost);
holder.fuelDateTv.setText(String.valueOf(fuelDates.get(position)));
holder.fueledCarTv.setText(String.valueOf(fueledCarIds.get(position)));
}
@Override
public int getItemCount() {
return fuelIds.size();
}
public interface RecyclerViewClickListener {
void onClick(View v, int position);
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView fuelIdTv, fuelAmountTv, fuelCostTv, fuelDateTv, fueledCarTv;
public MyViewHolder(@NonNull View view) {
super(view);
fuelIdTv = view.findViewById(R.id.fuelIdTv);
fuelAmountTv = view.findViewById(R.id.fuelAmountTv);
fuelCostTv = view.findViewById(R.id.fuelCostTv);
fuelDateTv = view.findViewById(R.id.fuelDateTv);
fueledCarTv = view.findViewById(R.id.fueledCarTv);
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
listener.onClick(v, getAdapterPosition());
}
}
}

FuelActivity.java

public class FuelActivity extends AppCompatActivity {

public static final String COLUMN_CAR_ID = "_id";
private DatabaseHelper myDB;
private RecyclerFuelAdapter.RecyclerViewClickListener listener;
private ArrayList<String> fuelIds, stationNames, fuelTypes, fuelAmounts, fuelCosts, mileages, fuelDates, fueledCarIds;
private RecyclerView recyclerView;
private RecyclerFuelAdapter RecyclerFuelAdapter;
private Button goToAddFuelBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fuel);
recyclerView = findViewById(R.id.fuelRecycler);
goToAddFuelBtn = findViewById(R.id.goToAddFuelBtn);
Intent intent1 = getIntent();
String value = intent1.getStringExtra(ProfileActivity.COLUMN_CAR_ID);
goToAddFuelBtn.setOnClickListener(v -> {
Intent intent4 = new Intent(getApplicationContext(), AddFuelActivity.class);
intent4.putExtra(COLUMN_CAR_ID, value);
startActivity(intent4);
});
myDB = new DatabaseHelper(FuelActivity.this);
fuelIds = new ArrayList<>();
stationNames = new ArrayList<>();
fuelTypes = new ArrayList<>();
fuelAmounts = new ArrayList<>();
fuelCosts = new ArrayList<>();
mileages = new ArrayList<>();
fuelDates = new ArrayList<>();
fueledCarIds = new ArrayList<>();
storeFuelsInArrays();
createAdapter();
}
@Override
public void onBackPressed()
{
super.onBackPressed();
startActivity(new Intent(FuelActivity.this, MainActivity.class));
finish();
}
private void createAdapter() {
setOnClickListener();
RecyclerFuelAdapter = new RecyclerFuelAdapter(FuelActivity.this, fuelIds, stationNames, fuelTypes, fuelAmounts, fuelCosts, mileages, fuelDates, fueledCarIds,  listener);
recyclerView.setAdapter(RecyclerFuelAdapter);
LinearLayoutManager layoutManager = new LinearLayoutManager(FuelActivity.this);
recyclerView.setLayoutManager(layoutManager);
}
private void setOnClickListener() {
listener = (v, position) -> {
Toast.makeText(getApplicationContext(), "clicked on " + fuelIds.get(position), Toast.LENGTH_SHORT).show();
};
}


private void storeFuelsInArrays() {
Cursor cursor = myDB.readAllFuels();
if (cursor.getCount() == 0) {
Toast.makeText(this, "No data to be displayed.", Toast.LENGTH_SHORT).show();
} else {
while (cursor.moveToNext()) {
fuelIds.add(cursor.getString(cursor.getColumnIndex("fuel_id")));
stationNames.add(cursor.getString(cursor.getColumnIndex("station_name")));
fuelTypes.add(cursor.getString(cursor.getColumnIndex("fuel_type")));
fuelAmounts.add(cursor.getString(cursor.getColumnIndex("fuel_amount")));
fuelCosts.add(cursor.getString(cursor.getColumnIndex("fuel_cost")));
mileages.add(cursor.getString(cursor.getColumnIndex("mileage")));
fuelDates.add(cursor.getString(cursor.getColumnIndex("fuel_date")));
fueledCarIds.add(cursor.getString(cursor.getColumnIndex("fueled_car_id")));
}
}
}
}

ProfileActivity.java

public class ProfileActivity extends AppCompatActivity {
public static final String COLUMN_CAR_ID = "_id";
private TextView myCarID, myCarBrand, myCarModel, myCarYear;
private Button goToFuelList, goToServiceList;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.profile_activity);
myCarID = findViewById(R.id.myCarID);
myCarBrand = findViewById(R.id.myCarBrand);
myCarModel = findViewById(R.id.myCarModel);
myCarYear = findViewById(R.id.myCarYear);
goToFuelList = findViewById(R.id.goToFuelList);
goToServiceList = findViewById(R.id.goToServiceList);
myCarID.setText(getCarsData(0));
myCarBrand.setText(getCarsData(1));
myCarModel.setText(getCarsData(2));
myCarYear.setText(getCarsData(3));
Intent intent = getIntent();
String value = intent.getStringExtra(MainActivity.COLUMN_CAR_ID);
goToFuelList.setOnClickListener(v -> {
Intent intent1 = new Intent(getApplicationContext(), FuelActivity.class);
intent1.putExtra(COLUMN_CAR_ID, value);
startActivity(intent1);
});
}
@SuppressLint("Recycle")
private String getCarsData(int option) {
SQLiteDatabase db = this.openOrCreateDatabase("CarsList.db", Context.MODE_PRIVATE, null);
Cursor cursor;
if(db != null) {
Intent intent = getIntent();
String value = intent.getStringExtra(MainActivity.COLUMN_CAR_ID);
cursor = db.rawQuery("SELECT _id,car_brand,car_model,car_year_made FROM cars WHERE _id = " + value, null);
if (cursor.getCount() == 0) {
Toast.makeText(getApplicationContext(), "no data", Toast.LENGTH_SHORT).show();
}
StringBuilder buffer = new StringBuilder();
while (cursor.moveToNext()) {
switch (option) {
case 0: buffer.append(cursor.getString(0));
break;
case 1: buffer.append(cursor.getString(1));
break;
case 2: buffer.append(cursor.getString(2));
break;
case 3: buffer.append(cursor.getString(3));
break;
}
}
return buffer.toString();
}
return null;
}
}

经过3天的尝试,我已经弄清楚了自己,所以如果有人会有同样的问题,这是显示依赖于另一个recyclerview值的recyclerview数据这里是适合我的方式,即使它可能不是完美的一个。

我只是传递了一个值来存储"_id">

FuelActivity.java

private void storeFuelsInArrays() {
Cursor cursor = myDB.readAllFuels();
Intent intent1 = getIntent();
String checkedValue = intent1.getStringExtra(ProfileActivity.COLUMN_CAR_ID);

if (cursor.getCount() == 0) {
Toast.makeText(this, "No data to be displayed.", Toast.LENGTH_SHORT).show();
} else {
while (cursor.moveToNext()) {
String value = cursor.getString(cursor.getColumnIndex("fueled_car_id"));
if (value.equals(checkedValue)) {
fuelIds.add(cursor.getString(cursor.getColumnIndex("fuel_id")));
stationNames.add(cursor.getString(cursor.getColumnIndex("station_name")));
fuelTypes.add(cursor.getString(cursor.getColumnIndex("fuel_type")));
fuelAmounts.add(cursor.getString(cursor.getColumnIndex("fuel_amount")));
fuelCosts.add(cursor.getString(cursor.getColumnIndex("fuel_cost")));
mileages.add(cursor.getString(cursor.getColumnIndex("mileage")));
fuelDates.add(cursor.getString(cursor.getColumnIndex("fuel_date")));
fueledCarIds.add(cursor.getString(cursor.getColumnIndex("fueled_car_id")));
}
}
}
}

如果有人知道更好的方法,我很高兴你能把它们放在这里。

最新更新