在recyclerview中进行多项选择无效

时间:2016-07-26 12:37:25

标签: java android xml

在onClick()中没有输入很长的clicklerview行。我不明白我的代码有什么问题。以下是我使用cardview制作的我的主要活动,适配器和我的recyclerview行。

以下是我的MainActivity.java

public class MainActivity extends AppCompatActivity implements RecyclerView.OnItemTouchListener,
        View.OnClickListener,
        ActionMode.Callback {

    ArrayList<ProductPojo> lastNameList;
    private RecyclerView recyclerView;
    private ProductAdapter adapter;
    private List<ProductPojo> albumList;
    GestureDetectorCompat gestureDetector;
    ActionMode actionMode;

    /////
    private ProgressDialog pDialog;
    ApiClass apigetOfferList;
    String response;

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        albumList = new ArrayList<>();
        lastNameList = new ArrayList<ProductPojo>(12);

        recyclerView.addOnItemTouchListener(
                new RecyclerItemClickListener(MainActivity.this, new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View v, final int position) {

                        Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();
                        final EditText edittext = new EditText(MainActivity.this);
                        AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                        alert.setMessage("Enter Your Last Name");
                        alert.setTitle("Fill me");

                        alert.setView(edittext);

                        alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                dialog.dismiss();

                                ProductPojo lNamePojo = new ProductPojo(edittext.getText().toString());
                                Log.d("lastNameList.size()", ""+lastNameList.size() +"  "+position);
                                if(!albumList.isEmpty() && lastNameList.size() != 0) {
                                    lastNameList.add(position, lNamePojo);
                                    Log.d("lastNameList.size()", ""+lastNameList.size());
                                }

                                adapter.notifyDataSetChanged();
                                adapter = new ProductAdapter(MainActivity.this, albumList, lastNameList);
                                recyclerView.setAdapter(adapter);
                            //    lName = edittext.getText().toString();


                            }
                        });

                        alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                dialog.dismiss();
                            }
                        });

                        alert.show();

                    }
                })
        );

       /* LinearLayoutManager llm = new LinearLayoutManager(this);
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(llm);
        recyclerView.setAdapter( adapter );*/
        gestureDetector = new GestureDetectorCompat(this, new RecyclerViewDemoOnGestureListener());
        ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();
        listViewLoaderTask.execute();


    }


    /**
     * RecyclerView item decoration - give equal margin around grid item
     */
    public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {

        private int spanCount;
        private int spacing;
        private boolean includeEdge;

        public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) {
            this.spanCount = spanCount;
            this.spacing = spacing;
            this.includeEdge = includeEdge;
        }

        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            int position = parent.getChildAdapterPosition(view); // item position
            int column = position % spanCount; // item column

            if (includeEdge) {
                outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)
                outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)

                if (position < spanCount) { // top edge
                    outRect.top = spacing;
                }
                outRect.bottom = spacing; // item bottom
            } else {
                outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing)
                outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f /    spanCount) * spacing)
                if (position >= spanCount) {
                    outRect.top = spacing; // item top
                }
            }
        }
    }

    /**
     * Converting dp to pixel
     */
    private int dpToPx(int dp) {
        Resources r = getResources();
        return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()));
    }

    private class ListViewLoaderTask extends AsyncTask<String, Void, String> {


        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Loading ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();

            apigetOfferList = new ApiClass();
        }


        @Override
        protected String doInBackground(String... args) {
            response = apigetOfferList.xmlFetchFunction();
            return response;
        }


        @Override
        protected void onPostExecute(String res) {

            Log.d("res", "" + res);
            StringReader reader = new StringReader(res);

            ProductXmlParser productXmlParser = new ProductXmlParser();

            List<HashMap<String, String>> products = null;

            try {
                /** Getting the parsed data as a List construct */
                products = productXmlParser.parse(reader);
            } catch (Exception e) {
                Log.d("Exception", e.toString());
            }
            Log.d("products", "" + products);

            for (int i = 0; i < products.size(); i++) {

                Log.d("productThumbnail", "" + products.get(i).get("productThumbnail"));
                ProductPojo album = new ProductPojo(products.get(i).get("productThumbnail"), products.get(i).get("productName"), products.get(i).get("categoryName"), products.get(i).get("productDescription"), products.get(i).get("numberOfRatings"), products.get(i).get("rating"), products.get(i).get("averageRatingImageURL"));

                albumList.add(album);
                lastNameList.add(album);
            }


            adapter = new ProductAdapter(MainActivity.this, albumList, lastNameList);
            adapter.notifyDataSetChanged();

            RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(MainActivity.this, 1);
            recyclerView.setLayoutManager(mLayoutManager);
            recyclerView.addItemDecoration(new GridSpacingItemDecoration(2, dpToPx(10), true));
            recyclerView.setItemAnimator(new DefaultItemAnimator());
            recyclerView.setAdapter(adapter);


            pDialog.dismiss();
        }
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {//in
        Log.d("RecyclerView","DemoActivity"+"onInterceptTouchEvent");
        gestureDetector.onTouchEvent(e);
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }

    private void myToggleSelection(int idx) {//in
        Log.d("RecyclerView","DemoActivity"+"myToggleSelection");
        adapter.toggleSelection(idx);
        String title = getString(R.string.selected_count, adapter.getSelectedItemCount());
        actionMode.setTitle(title);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.container_list_item) {//in
            // item click
            Log.d("RecyclerView","DemoActivity"+"item click");
            int idx = recyclerView.getChildLayoutPosition(view);
            if (actionMode != null) {
                myToggleSelection(idx);
                return;
            }
        }
    }

    private class RecyclerViewDemoOnGestureListener extends GestureDetector.SimpleOnGestureListener {

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {//in
            Log.d("RecyclerView","DemoActivity"+"onSingleTapConfirmed");
            View view = recyclerView.findChildViewUnder(e.getX(), e.getY());
            onClick(view);
            return super.onSingleTapConfirmed(e);
        }

        public void onLongPress(MotionEvent e) {//in
            Log.d("RecyclerView","DemoActivity"+"onLongPress");
            View view = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (actionMode != null) {
                return;
            }
            // Start the CAB using the ActionMode.Callback defined above
            actionMode = startActionMode(MainActivity.this);
            int idx = recyclerView.getChildAdapterPosition(view);
            myToggleSelection(idx);
            super.onLongPress(e);
        }
    }

    @Override
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {//in
        // Inflate a menu resource providing context menu items
        Log.d("RecyclerView","DemoActivity"+"onCreateActionMode");
        MenuInflater inflater = actionMode.getMenuInflater();
        inflater.inflate(R.menu.menu_cab_recyclerviewdemoactivity, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }
}

这是我的Adapter类

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

    private Context mContext;
    private List<ProductPojo> albumList;
    String lName;

    private List<DemoModel> items;
    private SparseBooleanArray selectedItems;


    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView lastName, cat_name, product_name, product_design, numOfRatings, rate;
        public ImageView thumbnail1, thumbnail2;

        public MyViewHolder(View view) {
            super(view);

            lastName = (TextView) view.findViewById(R.id.lastName);
            product_name = (TextView) view.findViewById(R.id.product_name);
            product_design = (TextView) view.findViewById(R.id.product_design);
            cat_name = (TextView) view.findViewById(R.id.category_name);
            rate = (TextView) view.findViewById(R.id.rate);
            numOfRatings = (TextView) view.findViewById(R.id.noOfRatings);
            thumbnail1 = (ImageView) view.findViewById(R.id.thumbnail);
            thumbnail2 = (ImageView) view.findViewById(R.id.thumbnail2);


            view.setOnClickListener(new View.OnClickListener() {


                @Override
                public void onClick(View v) {

                    Toast.makeText(itemView.getContext(), " " + getItemId(), Toast.LENGTH_SHORT).show();

                }
            });

            view.setOnLongClickListener(new View.OnLongClickListener()
                                     {
                                         @Override
                                         public boolean onLongClick(View v)
                                         {
                                             Toast.makeText(v.getContext(), "Long Click Listerner Position is " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
                                             return false;
                                         }
                                     }
            );
        }
    }


    public ProductAdapter(Context mContext, List<ProductPojo> albumList, ArrayList<ProductPojo> lName) {
        this.mContext = mContext;
        this.albumList = albumList;
        selectedItems = new SparseBooleanArray();
    }

    public int getSelectedItemCount() {
        Log.d("RecyclerViewDemoAdapter","getSelectedItemCount");
        return selectedItems.size();
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.album_card, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        ProductPojo album = albumList.get(position);


        holder.lastName.setText("Last Name : " + album.getlName());
        holder.product_name.setText("Product Name : " + album.getpName());
        holder.cat_name.setText("Category Name : " + album.getcName());
        holder.product_design.setText("Product Description : " + album.getpDesc());
        holder.rate.setText("Rating : " + album.getRating());
        holder.numOfRatings.setText("No.of ratings : " + album.getNoOfRatings());

        Drawable productDrawable = LoadImageFromProductLink(album.getpLink());
        holder.thumbnail1.setImageDrawable(productDrawable);
        // loading album cover using Glide library
        Glide.with(mContext).load(album.getpLink()).into(holder.thumbnail1);

        Drawable rateDrawable = LoadImageFromRateLink(album.getRateLink());
        holder.thumbnail2.setImageDrawable(rateDrawable);
        // loading album cover using Glide library
        Glide.with(mContext).load(album.getRateLink()).into(holder.thumbnail2);

    }

    private Drawable LoadImageFromProductLink(String url) {
        try {
            InputStream is = (InputStream) new URL(url).getContent();
            Drawable d = Drawable.createFromStream(is, "src name");
            return d;
        } catch (Exception e) {
            System.out.println("Exc=" + e);
            return null;
        }
    }

    private Drawable LoadImageFromRateLink(String url) {
        try {
            InputStream is = (InputStream) new URL(url).getContent();
            Drawable d = Drawable.createFromStream(is, "src name");
            return d;
        } catch (Exception e) {
            System.out.println("Exc=" + e);
            return null;
        }
    }


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

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }

    public void toggleSelection(int pos) {
        if (selectedItems.get(pos, false)) {
            Log.d("RecyclerViewDemoAdapter","IftoggleSelection");
            selectedItems.delete(pos);
        } else {
            Log.d("RecyclerViewDemoAdapter","ElsetoggleSelection");
            selectedItems.put(pos, true);
        }
        notifyItemChanged(pos);
    }
}


**And this is my row**



 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.CardView
            android:id="@+id/card_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:layout_margin="@dimen/card_margin"
            android:elevation="3dp"
            card_view:cardCornerRadius="@dimen/card_album_radius">

            <LinearLayout
                android:id="@+id/container_list_item"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="?android:attr/selectableItemBackground"
                android:orientation="vertical">

                <LinearLayout
                    android:id="@+id/first"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">

                    <ImageView
                        android:id="@+id/thumbnail"
                        android:layout_width="130dp"
                        android:layout_height="130dp"
                        android:layout_margin="5dp"
                        android:clickable="true"
                        android:padding="5dp"
                        android:scaleType="fitXY" />

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="vertical">

                        <TextView
                            android:id="@+id/lastName"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dp"
                            android:text="Product Name"
                            android:textColor="@color/colorPrimaryDark"
                            android:textSize="@dimen/backdrop_subtitle"
                            android:textStyle="bold"
                            android:visibility="gone" />


                        <TextView
                            android:id="@+id/product_name"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dp"
                            android:layout_marginTop="20dp"
                            android:text="Product Name"
                            android:textColor="@color/album_title"
                            android:textSize="@dimen/album_title" />

                        <TextView
                            android:id="@+id/category_name"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dp"
                            android:text="Category Name"
                            android:textColor="@color/album_title"
                            android:textSize="@dimen/album_title" />
                    </LinearLayout>
                </LinearLayout>

                <TextView
                    android:id="@+id/product_design"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="Product Design"
                    android:textColor="@color/album_title"
                    android:textSize="@dimen/album_title" />

                <LinearLayout
                    android:id="@+id/second"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="5dp"
                    android:orientation="horizontal">

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:orientation="vertical">

                        <TextView
                            android:id="@+id/rate"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dp"
                            android:text="Rate"
                            android:textColor="@color/album_title"
                            android:textSize="@dimen/album_title" />

                        <TextView
                            android:id="@+id/noOfRatings"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dp"
                            android:text="No. of Ratings"
                            android:textColor="@color/album_title"
                            android:textSize="@dimen/album_title" />
                    </LinearLayout>

                    <ImageView
                        android:id="@+id/thumbnail2"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginLeft="10dp"
                        android:layout_marginRight="10dp" />
                </LinearLayout>


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

    </LinearLayout>

请帮帮我们..我等你的回答。谢谢你!

1 个答案:

答案 0 :(得分:0)

下面的详细信息

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
        private Article mArticle;

        private TextView mNameTextView;

        public ViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            itemView.setOnLongClickListener(this);
            mNameTextView = (TextView) itemView.findViewById(R.id.grid_item_article_name_textView);
        }

        public void bind(Article article) {
            mArticle = article;
            mNameTextView.setText(article.getName());
        }

        @Override
        public void onClick(View view) {
            // Context context = view.getContext();
            // mArticle.getName()
        }

        @Override
        public boolean onLongClick(View view) {
            // Handle long click
        }
    }

Handle on item long click on recycler view