[英]How can I display data in recyclerview only with specific value
I'm trying to make something like a diary for storing refuelings of the car using SQLite database, but I don't know how to limit visible data only to refuelings that are assigned to a specific car ID.我正在尝试使用 SQLite 数据库制作诸如存储汽车加油的日记之类的东西,但我不知道如何将可见数据仅限于分配给特定汽车 ID 的加油。
Process looks like this: (we assume that there are data in the database)流程是这样的:(我们假设数据库中有数据)
After I click on a specific car, I'm getting redirected to cars profile activity where I can see more info about that car.单击特定汽车后,我将被重定向到汽车配置文件活动,在那里我可以看到有关该汽车的更多信息。 Then, after choosing an option "Record a fuelling" I'm getting redirected to recyclerview of recorded refuellings of a car that I chosed previously.然后,在选择“记录加油”选项后,我将被重定向到我之前选择的汽车的记录加油的 recyclerview。
Problem:问题:
I'm getting every row from table "fuels" after entering the list from cars profile, but I want to see only refuelings that are assigned to this one car.从汽车配置文件输入列表后,我从“燃料”表中获取每一行,但我只想查看分配给这辆车的加油。
Here are my 3 activities that matter in this problem:以下是我在这个问题中的 3 项重要活动:
First one is a list of registered cars first activity第一个是注册汽车第一个活动的列表
Second one is a cars profile second activity第二个是汽车简介第二个活动
Third one is a list of refuelings third activity第三个是加油清单第三个活动
(The number on the end of every item on the refuelings list is a ID of a car that I came from and added data to) (加油清单上每一项末尾的数字是我来自并添加数据的汽车的ID)
DatabaseHelper.java数据库助手.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 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 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 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;
}
}
After 3 days of trying I've figured it out myself, so if anyone ever will have the same problem which is displaying recyclerview data that depend on value from another recyclerview here is the way that works for me even that it may not be the perfect one.经过 3 天的尝试,我自己弄清楚了,所以如果有人遇到同样的问题,那就是显示依赖于另一个 recyclerview 的值的 recyclerview 数据,这对我来说是可行的方式,即使它可能不是完美的一。
I simply passed value that stores "_id" column from SQLite table inside intent and checked for it while adding data to ArrayLists.我只是在意图内部传递了存储 SQLite 表中的“_id”列的值,并在向 ArrayLists 添加数据时检查了它。
FuelActivity.java 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")));
}
}
}
}
If anyone knows better ways to do it, I'd be happy if you could put them in here.如果有人知道更好的方法,如果你能把它们放在这里,我会很高兴。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.