简体   繁体   English

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

[英]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.

相关问题 Firebase 数据未显示在回收站视图中。 如何在 recyclerview 中显示来自 firebase 的用户特定数据? - Firebase data not displaying in Recycler view. How do I display user specific data from firebase in recyclerview? 如何使用RecyclerView显示空视图? - How can I display an emptyview with a RecyclerView? 如何在RecyclerView中显示已安装的应用程序? - How can I display installed apps in a RecyclerView? 如何在 Recyclerview 中显示图像 - Recyclerview 图像显示错误 - How can I show image in Recyclerview - Recyclerview image display error 如何从 Firebase 获取特定用户信息并在 RecyclerView 中显示? - How can I get specific user info from Firebase and display in RecyclerView? 如何在Andriod中使用recyclerview在特定条件下显示数据? - How to display data in specific conditions using recyclerview in Andriod? Android ROOM - 如何在 RecyclerView 中显示来自 3 个相关实体的数据? - Android ROOM- How can I display data from 3 related entities in a RecyclerView? 我应该如何在只有特定用户 ID 的回收站视图中查询帖子? - How should I query posts in a recyclerview with only specific user id? 从mysql数据库列接收某些数据后,如何在recyclerview中更改特定卡片的颜色 - How can I change color of specific card in recyclerview after receiving certain data from mysql database column 身份验证后如何显示特定于用户的数据 - How can i display User-specific data after authentication
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM