Как добавить данные в Firestore от RecyclerView Adapter? - PullRequest
0 голосов
/ 12 июня 2019

Я знаю, что есть решения для подобных проблем, но мой случай несколько сложнее.

У меня есть FoodMenuActivity, который содержит RecyclerView и Button.RecyclerView показывает меню и ElegantNumberButton для выбора количества товара.Button должен Intent до SummaryActivity и в то же время добавлять выбранные предметы и количества в Firestore.

Вот часть FoodMenuAdapter:

public class FoodMenuAdapter extends FirestoreRecyclerAdapter<FoodMenu, FoodMenuAdapter.FoodMenuHolder> {

    public String foodName;
    public int foodQuantity;
    public int price;
    public int parentStoreId;
    public int quantityPrice;

    private static final String TAG = "FoodMenuAdapter";

    private Map<String, Object> map = new HashMap<>();

    public FoodMenuAdapter(@NonNull FirestoreRecyclerOptions options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull final FoodMenuHolder holder, final int position, @NonNull FoodMenu model) {
        foodName = model.getFoodName();
        price = model.getPrice();
        parentStoreId = model.getParentStoreId();

        holder.foodNameView.setText(foodName);
        holder.priceView.setText("NT$"+String.valueOf(price));

        holder.btnQuantity.setOnValueChangeListener(new ElegantNumberButton.OnValueChangeListener() {
            @Override
            public void onValueChange(ElegantNumberButton view, int oldValue, int newValue) {
                foodQuantity = Integer.parseInt(holder.btnQuantity.getNumber());
                quantityPrice = foodQuantity*price;

                map.put("parentStoreId", parentStoreId);
                map.put("foodName", foodName);
                map.put("foodQuantity", foodQuantity);
            }
        });
    }
}

FoodMenuActivity

public class FoodMenuActivity extends AppCompatActivity {

    private static final String TAG = "FoodMenuActivity";

    private String parentPath;
    private String foodMenuPath = "menu";
    private Button btnConfirm;

    FirebaseFirestore db = FirebaseFirestore.getInstance();

    private CollectionReference foodMenuRef;
    private FoodMenuAdapter foodMenuAdapter;
    private ArrayList<HashMap<String,String>> listMap =  new ArrayList<HashMap<String, String>>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_food_menu);

        btnConfirm = findViewById(R.id.btn_confirm);

        btnConfirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String foodName = foodMenuAdapter.foodName;
                int foodQuantity = foodMenuAdapter.foodQuantity;
                int price = foodMenuAdapter.price;
                int parentStoreId = foodMenuAdapter.parentStoreId;

                Toast.makeText(FoodMenuActivity.this, "foodName : "+foodName+" foodQuantity : "+foodQuantity, Toast.LENGTH_SHORT).show();
            }
        });

        setUpRecyclerView();
    }
}

activity_food_menu

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FoodMenuActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="68dp">
    </android.support.v7.widget.RecyclerView>

    <Button
        android:id="@+id/btn_confirm"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_gravity="bottom"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:text="add to cart"/>
</android.support.design.widget.CoordinatorLayout>

food_menu_item

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/food_name_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_centerVertical="true"
            android:maxLines="1"
            android:textAppearance="@style/TextAppearance.AppCompat.Large"/>

        <TextView
            android:id="@+id/price_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/btn_quantity"
            android:layout_centerVertical="true"/>

        <com.cepheuen.elegantnumberbutton.view.ElegantNumberButton
            android:id="@+id/btn_quantity"
            android:layout_width="80dp"
            android:layout_height="48dp"
            android:layout_toLeftOf="@id/btn_add_to_cart"
            android:layout_centerVertical="true"
            app:initialNumber="0">
        </com.cepheuen.elegantnumberbutton.view.ElegantNumberButton>

    </RelativeLayout>

</android.support.v7.widget.CardView>

Мой инстинкт велел мне хранить данные в Map, но японятия не имею как.Есть ли другой способ сохранить состояние элементов с ненулевым количеством?

Моя цель - когда btnConfirm onClicked, приложение переходит на SummaryActivity, который показывает все выбранные элементы с именами элементови количества.И добавьте эти данные к Firestore одновременно.

1 Ответ

0 голосов
/ 12 июня 2019

Все объекты коллекций реализуют Serializable, поэтому HashMap может быть передано через Intent. Таким образом, чтобы передать это HashMap в SummaryActivity, используйте putExtra(String key, Serializable obj) из FoodMenuActivity, а затем приведите возвращаемое значение из getIntent().getSerializableExtra(String key) в качестве HashMap внутри SummaryActivity. Добавьте эти данные в Firestore перед запуском Intent.

FoodMenuActivity

public class FoodMenuActivity extends AppCompatActivity {

    ///....

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_food_menu);
        btnConfirm = findViewById(R.id.btn_confirm);
        btnConfirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                selectedItemsHashMap = foodMenuAdapter.map;
                saveToFirestore(selectedItemsHashMap);
                Intent intent = new Intent(this, SummaryActivity.class);
                intent.putExtra("selectedItems", selectedItemsHashMap);
                startActivity(intent);
            }
        });

        // ...
    }
}

SummaryActivity

public class SummaryActivity extends AppCompatActivity {

    ///....

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //...
        HashMap<String, String> receivedItems = (HashMap<String, String>)getIntent().getSerializableExtra("selectedItems");
        Log.v("Received Items - Names:", receivedItems.get("foodName"));

        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...