Как получить объект выбранного флажка? - PullRequest
0 голосов
/ 26 апреля 2018

Я делаю приложение для покупок в Android с Firebase, получаю список товаров и хорошо показываю их в адаптере массива. Когда мне нужно проверить товар и изменить его в Firebase. Я не знаю, должен ли я сделать это в адаптере массива или в моем фрагменте. Мой класс - itemCart и происходит от другой еды, у которой есть ID. Моя проблема, когда я проверяю элемент, и я не могу получить доступ к объекту, который содержит этот флажок, как я могу это сделать?

У меня есть этот класс:

public class itemCart extends Food implements Serializable {
    public String quantity;
    public String mesurementunit;
    public Boolean bought;


    public itemCart(){}

    public itemCart(Food food, String quantity, String mesurementunit, Boolean bought) {
        super(food.get_id());
        this.quantity = quantity;
        this.mesurementunit = mesurementunit;
        this.bought = bought;
    }

    public String getQuantity() {
        return quantity;
    }

    public void setQuantity(String quantity) {
        this.quantity = quantity;
    }

    public String getMesurementunit() {
        return mesurementunit;
    }

    public void setMesurementunit(String mesurementunit) {
        this.mesurementunit = mesurementunit;
    }

    public Boolean getBought() {
        return bought;
    }

    public void setBought(Boolean bought) {
        this.bought = bought;
    }
}

Также у меня есть этот ArrayAdapter

public class ShoppingListFragmentArrayAdapter extends ArrayAdapter<itemCart> {
    List<itemCart> listItemsCart;
    itemCart mitemCart;

    FirebaseDatabase mFirebaseDatabase;
    String uid;
    FirebaseAuth mFirebaseAuth;
    DatabaseReference mitemCardReference;


    public ShoppingListFragmentArrayAdapter(@NonNull Context context, int resource, List<itemCart> objects) {
        super(context, resource, objects);
        this.listItemsCart = objects;

    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        if (convertView == null){
            convertView = ((Activity)getContext()).getLayoutInflater().inflate(R.layout.row_shopping_cart,parent,false);
        }
        mFirebaseAuth = FirebaseAuth.getInstance();
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        uid = mFirebaseAuth.getUid().toString();
        mitemCardReference = mFirebaseDatabase.getReference().child("carts").child(uid);


        TextView foodName = (TextView) convertView.findViewById(R.id.txtViewNameShoppingList);
        CircleImageView imgFood = (CircleImageView) convertView.findViewById(R.id.foodCardCircleView);
        CheckBox checkBoxFood = (CheckBox) convertView.findViewById(R.id.chartFoodChecklist);

        mitemCart = listItemsCart.get(position);
        checkBoxFood.setChecked(mitemCart.getBought());
        foodName.setText(mitemCart.getCorrectLanguageName()+" "+mitemCart.getQuantity()+" "+mitemCart.getMesurementunit());
        Glide.with(imgFood.getContext())
                .load(mitemCart.getImg_firebase())
                .into(imgFood);
        checkBoxFood.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //here i wanna get the object
            }
        });

        return convertView;
    }
}

Правильно ли это делать в адаптере, или я должен делать это в моем фрагменте?

public class ShoppingListFragment extends Fragment {

    private View rootView;

    private ShoppingListFragmentArrayAdapter mshoppingListFragmentArrayAdapter;
    private ProgressBar mProgressBar;
    private CheckBox mcheckBox;
    private Button mBtnClear;

    private String uid;

    List<itemCart> itemCarts;

    private itemCart mitemCart;

    private ListView mListView;

    private FirebaseDatabase mFirebaseDatabase;
    private DatabaseReference mItemCartReference;

    public ShoppingListFragment (){

    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        uid = FirebaseAuth.getInstance().getCurrentUser().getUid().toString();

        mFirebaseDatabase = FirebaseDatabase.getInstance();
        mItemCartReference = mFirebaseDatabase.getReference().child("carts").child(uid);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_shopping_card_list,container,false);

        mListView = (ListView) rootView.findViewById(R.id.lstViewShoppingCart);
        mProgressBar = (ProgressBar) rootView.findViewById(R.id.progressBarCartFoodList);
        mBtnClear = (Button) rootView.findViewById(R.id.btnClearShoppingList);
        mcheckBox = (CheckBox) rootView.findViewById(R.id.chartFoodChecklist);

        itemCarts = new ArrayList<>();

        mProgressBar.setVisibility(View.VISIBLE);

        mItemCartReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                clearItemCartList();
                for (DataSnapshot itemSnapshot : dataSnapshot.getChildren()) {
                    mitemCart = itemSnapshot.getValue(itemCart.class);
                   updateitemCartList(mitemCart);
                }
                mProgressBar.setVisibility(View.INVISIBLE);


                mshoppingListFragmentArrayAdapter = new ShoppingListFragmentArrayAdapter(getActivity(),R.layout.row_shopping_cart,itemCarts);
                mListView.setAdapter(mshoppingListFragmentArrayAdapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });



        return rootView;
    }



    private void updateitemCartList(itemCart item ) {
        itemCarts.add(item);
    }
    private void clearItemCartList(){
        itemCarts.clear();
    }

}

Когда мой флажок щелкается или изменяется, мне нужно получить идентификатор объекта itemCart this.

В этом коде объект itemCart моего arrayAdapter всегда получает последний, который у меня есть.

1 Ответ

0 голосов
/ 26 апреля 2018

Во-первых, вы должны создать интерфейс

    interface ItemClickListener{
          void onItemClicked(ItemCart mItemCart);
     }

чем обновить адаптер

    private ItemClickListener itemClickListener

    public ShoppingListFragmentArrayAdapter(@NonNull Context context, int resource, List<itemCart> objects,
                                            ItemClickListener itemClickListener) {
        super(context, resource, objects);
        this.listItemsCart = objects;
        this.itemClickListener = itemClickListener;
    }


checkBoxFood.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            itemClickListener.onItemClicked(mItemCart);
        }
    });

И передать слушателя адаптеру вот так

new ShoppingListFragmentArrayAdapter(getActivity(), R.layout.row_shopping_cart, itemCarts, new ItemClickListener() {
    @Override
    public void onItemClicked(ItemCart itemCart) {
        // You code to handle clicked item
    }
});

UPDATE Сделайте так, чтобы ваш массив массив

public class ShoppingListFragmentArrayAdapter extends ArrayAdapter<itemCart> {
List<itemCart> listItemsCart;

FirebaseDatabase mFirebaseDatabase;
String uid;
FirebaseAuth mFirebaseAuth;
DatabaseReference mitemCardReference;

private ItemClickListener itemClickListener;

public ShoppingListFragmentArrayAdapter(@NonNull Context context, int resource, List<itemCart> objects,
                                        ItemClickListener itemClickListener) {
    super(context, resource, objects);
    this.listItemsCart = objects;
    this.itemClickListener = itemClickListener;
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    if (convertView == null){
        convertView = ((Activity)getContext()).getLayoutInflater().inflate(R.layout.row_shopping_cart,parent,false);
    }
    mFirebaseAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    uid = mFirebaseAuth.getUid().toString();
    mitemCardReference = mFirebaseDatabase.getReference().child("carts").child(uid);


    TextView foodName = (TextView) convertView.findViewById(R.id.txtViewNameShoppingList);
    CircleImageView imgFood = (CircleImageView) convertView.findViewById(R.id.foodCardCircleView);
    CheckBox checkBoxFood = (CheckBox) convertView.findViewById(R.id.chartFoodChecklist);

    itemCart mitemCart = listItemsCart.get(position);
    checkBoxFood.setChecked(mitemCart.getBought());
    foodName.setText(mitemCart.getCorrectLanguageName()+" "+mitemCart.getQuantity()+" "+mitemCart.getMesurementunit());
    Glide.with(imgFood.getContext())
            .load(mitemCart.getImg_firebase())
            .into(imgFood);
    checkBoxFood.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            itemClickListener.onItemClicked(mItemCart);
        }
    });

    return convertView;
}

}

...