按复选框删除该卡片视图

时间:2018-10-01 03:21:16

标签: android android-recyclerview recycler-adapter

当用户按下晶圆厂时,我的应用程序基本上会动态添加cardviews。当用户按下特定的cardview时,该cardview被删除。

cardviews内各有一个checkbox。我正在尝试这样做,以便当用户按下checkbox时,cardview也被删除。

所以我已经完成了

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // makes the set disappear when checkbox is ticked.

        productList.remove(position);
        notifyItemRemoved(position);

        Toast.makeText(create, "Done!",Toast.LENGTH_LONG).show();
    }
});

但是我得到了这个错误:

java.lang.NullPointerException
        at com.app.supermarketaislefinder.ProductAdapter.onBindViewHolder(ProductAdapter.java:159)
        at com.app.supermarketaislefinder.ProductAdapter.onBindViewHolder(ProductAdapter.java:29)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
        at android.view.View.layout(View.java:13856)
        at android.view.ViewGroup.layout(ViewGroup.java:4424)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948)
        at android.view.View.layout(View.java:13856)
        at android.view.ViewGroup.layout(ViewGroup.java:4424)
        at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1855)
        at android.view.View.layout(View.java:13856)
        at android.view.ViewGroup.layout(ViewGroup.java:4424)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
        at android.view.View.layout(View.java:13856)
        at android.view.ViewGroup.layout(ViewGroup.java:4424)
        at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:443)
        at android.view.View.layout(View.java:13856)
        at android.view.ViewGroup.layout(ViewGroup.java:4424)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
        at android.view.View.layout(View.java:13856)
        at android.view.ViewGroup.layout(ViewGroup.java:4424)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1655)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1513)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1426)
        at android.view.View.layout(View.java:13856)
        at android.view.ViewGroup.layout(ViewGroup.java:4424)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
        at android.view.View.layout(View.java:13856)
        at android.view.ViewGroup.layout(ViewGroup.java:4424)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1992)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1813)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1113)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4481)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
        at android.view.Choreographer.doCallbacks(Choreographer.java:555)
        at android.view.Choreographer.doFrame(Choreographer.java:525)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4867)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
        at dalvik.system.NativeStart.main(Native Method)

第29行是public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder> {

第159行是checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

我该如何解决?

产品适配器

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder> {

    private Map<Integer, Integer> mSpinnerSelectedItem = new HashMap<Integer, Integer>();

    //this context we will use to inflate the layout
    CheckBox checkBox;

    //private Context mCtx;
    private SearchableSpinner spinner;

    //we are storing all the products in a list
    private List<Product> productList;

    private Activity create;

    public  ProductAdapter(Activity activity){
        create = activity;
    }

    //getting the context and product list with constructor
    public  ProductAdapter(Activity activity, List<Product> productList) {
       // this.mCtx = mCtx;
        create = activity;
        this.productList = productList;
    }

    @Override
    public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //inflating and returning our view holder
        LayoutInflater inflater = LayoutInflater.from(create);
        View view = inflater.inflate(R.layout.layout_products, null);
        return new ProductViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ProductViewHolder holder, final int position) {
        // //getting the product of the specified position

        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(create, R.layout.item_spinner_layout,
                Product.getSpinnerItemsList());
        spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        holder.spinner.setAdapter(spinnerArrayAdapter);

        holder.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int mPosition, long id) {
                mSpinnerSelectedItem.put(position, mPosition);

                TextView mTextView = view.findViewById(R.id.mSpinnerText);
               /* Toast.makeText(create, "Selected Item: " + mTextView.getText().toString(), Toast.LENGTH_LONG).show();
                Log.e("***************", "Selected Item: " + mTextView.getText().toString());*/
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        //binding the data with the viewholder views
        if (mSpinnerSelectedItem.containsKey(position)) {
            holder.spinner.setSelection(mSpinnerSelectedItem.get(position));
        }

        holder.getView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(create);

                // set title
                alertDialogBuilder.setTitle("Delete Item");

                // set dialog message
                alertDialogBuilder
                    .setMessage("Are you sure you want to delete this item?")
                    .setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // if this button is clicked, close
                            // current activity

                            productList.remove(position);
                            notifyItemRemoved(position);

                            Toast.makeText(create, "Item removed.",Toast.LENGTH_LONG).show();
                        }
                    })
                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // if this button is clicked, just close
                            // the dialog box and do nothing
                            dialog.cancel();
                        }
                    });

                // create alert dialog
                AlertDialog alertDialog = alertDialogBuilder.create();

                // show it
                alertDialog.show();
            }
        });

        //checkbox ticked

        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // makes the set disappear when checkbox is ticked.

                productList.remove(position);
                notifyItemRemoved(position);

                Toast.makeText(create, "Done!",Toast.LENGTH_LONG).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return productList.size();
    }

    class ProductViewHolder extends RecyclerView.ViewHolder {
        SearchableSpinner spinner;
        EditText editText;
        TextView textView5;
        CheckBox checkBox;
        LinearLayout linearLayout;
        View rootView;

        public ProductViewHolder(View itemView) {
            super(itemView);

            spinner = itemView.findViewById(R.id.spinner);
            editText = itemView.findViewById(R.id.editText);
            textView5 = itemView.findViewById(R.id.textView5);
            checkBox = itemView.findViewById(R.id.checkBox);
            rootView = itemView.findViewById(R.id.linearLayout);
        }

        public View getView() {
            return rootView;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

看到您犯了一个愚蠢的错误。您声明上面没有定义的signupValid并将Checkbox设置为该OnChangedList。.

CheckBox

答案 1 :(得分:1)

您应使用上述解决方案。您应该在onBindViewHolder的{​​{1}}方法中使用它。像这样

Adapter