【问题标题】:How to get the object of selected checkbox?如何获取选中复选框的对象?
【发布时间】:2018-04-26 14:03:03
【问题描述】:

我正在使用firebase在android中制作一个购物清单应用程序,我获得了items列表,并很好地显示在数组适配器中。当我需要检查一个项目并在Firebase中更改它时。我不知道我是否必须在数组适配器或我的片段中这样做。我的课程是 itemCart 并从另一个具有 ID 的 Food 扩展。 我的问题是当我检查项目时,我无法访问包含此复选框的对象,我该怎么办?

我有这门课:

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 的 id。

在我的 arrayAdapter 的 itemCart 对象中的这段代码中,总是接收我拥有的最后一个。

【问题讨论】:

    标签: android object checkbox android-arrayadapter


    【解决方案1】:

    首先,你必须创建接口

        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
        }
    });
    

    更新 像这样制作你的数组适配器

    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;
    }
    

    }

    【讨论】:

    • 问题是,如果我把checkBoxFood.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { mitemCart.setBought(isChecked); } });mitemCart 总是有我放在适配器上创建的最后一个对象。不是被点击的复选框的对象
    • 尝试将回调传递给您的适配器,返回点击的对象,例如这个 itemClickListener.onItemClicked(mItemCart)
    • 对不起,我不明白如何实现它,你能给我举个例子吗?这!!
    • 希望对你有帮助
    • 它有效,但我不知道为什么我要检索我放在列表视图中的最后一项。单击每个复选框时:S
    猜你喜欢
    • 2013-08-31
    • 2014-02-20
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多