Android RecyclerView: Ändern Sie die Layoutdatei LIST in GRID onOptionItemSelected

Lesezeit: 4 Minuten

Benutzer-Avatar
Pratik Butani

Ich entwickle eine Android-Anwendung für Online-Shopping. Ich habe die folgende Ansicht für die Produktliste erstellt RecyclerViewin dem ich die Ansicht ändern möchte bei der Auswahl des Optionsmenüpunkts:

Folgendes habe ich erstellt Adapter genannt ProductAdapterindem ich Code zum Ändern des Layouts in implementiert habe onCreateViewHolder zum Auswählen einer Layoutdatei basierend auf einem booleschen Wert.

Code des Adapters ProductAdapter:

    /***
     * ADAPTER for Product to binding rows in List
     */
    private class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductRowHolder> {

        private List<Product> productList;

        private Context mContext;

        public ProductAdapter(Context context, List<Product> feedItemList) {
            this.productList = feedItemList;
            this.mContext = context;
        }

        @Override
        public ProductRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(isProductViewAsList ? R.layout.product_row_layout_list : R.layout.product_row_layout_grid, null);
            ProductRowHolder mh = new ProductRowHolder(v);
            return mh;
        }

        @Override
        public void onBindViewHolder(ProductRowHolder  productRowHolder, int i) {
            Product prodItem = productList.get(i);

//            Picasso.with(mContext).load(feedItem.getName())
//                    .error(R.drawable.ic_launcher)
//                    .placeholder(R.drawable.ic_launcher)
//                    .into(productRowHolder.thumbnail);


            double price = prodItem.getPrice();
            double discount = prodItem.getDiscount();
            double discountedPrice = price - (price * discount / 100);

            String code = "";
            if(prodItem.getCode() != null)
                code = "[" + prodItem.getCode() + "] ";

            productRowHolder.prodIsNewView.setVisibility(prodItem.getIsNew() == 1 ? View.VISIBLE : View.INVISIBLE);
            productRowHolder.prodNameView.setText(code + prodItem.getName());
            productRowHolder.prodOriginalRateView.setText("Rs." + new BigDecimal(price).setScale(2,RoundingMode.DOWN));
            productRowHolder.prodDiscView.setText("" + new BigDecimal(discount).setScale(2,RoundingMode.DOWN) + "% off");
            productRowHolder.prodDiscRateView.setText("Rs." + new BigDecimal(discountedPrice).setScale(2,RoundingMode.DOWN));

            productRowHolder.prodOriginalRateView.setPaintFlags(productRowHolder.prodOriginalRateView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        }

        @Override
        public int getItemCount() {
            return (null != productList ? productList.size() : 0);
        }

        public class ProductRowHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            //Declaration of Views

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

                view.setOnClickListener(this);

                //Find Views
            }

            @Override
            public void onClick(View view) {
               //Onclick of row
            }
        }
    }

Danach habe ich Code zum Ändern erstellt RecyclerView Layout ab List zu Grid und umgekehrt in onOptionsItemSelectedhier rufe ich an mAdapter.notifyDataSetChanged(); so wird der Adapter erneut aufgerufen und der Wert geändert.

onOptionsItemSelected:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        switch (id) {
            case R.id.action_settings:
                return true;
            case android.R.id.home:
                finish();
                break;
            case R.id.product_show_as_view:
                isProductViewAsList = !isProductViewAsList;
                supportInvalidateOptionsMenu();
                mRecyclerView.setLayoutManager(isProductViewAsList ? new LinearLayoutManager(this) : new GridLayoutManager(this, 2));
                mAdapter.notifyDataSetChanged();
                break;
        }

        return super.onOptionsItemSelected(item);
    }

Ich habe wenig Erfolg wie:

Bild von Grid Layout:

Geben Sie hier die Bildbeschreibung ein

Bild von List Layout:

Geben Sie hier die Bildbeschreibung ein

ABER JETZT, WENN ICH SCROLLE und dann ANSICHT ÄNDERN wird angezeigt wie:

Grid Layout:

Geben Sie hier die Bildbeschreibung ein

List Layout:

Geben Sie hier die Bildbeschreibung ein

Ich weiß nicht, warum es nach dem Scrollen passiert. Gibt es eine andere Möglichkeit, die Ansicht so zu ändern?

Heute habe ich gerade gesehen, dass dieses Problem daran liegt ImageViewohne dass es perfekt funktioniert.

Helfen Sie bitte, Ihre Hilfe wird geschätzt.

  • Diese Antwort könnte helfen: stackoverflow.com/a/24933117/2649012

    – Phantômaxx

    18. Februar 2015 um 11:03 Uhr

  • Verwenden Sie diese RecyclerView.setHasFixedSize(true);

    – Amrut Bidri

    26. Februar 2015 um 6:52 Uhr

  • es ist mRecyclerView.setHasFixedSize(true); aber funktioniert bei mir nicht. eine andere Lösung?

    – Pratik Butani

    26. Februar 2015 um 7:03 Uhr

  • Ich denke, dieser Repost kann Ihnen helfen: RecyclerView: How to clear cached/recycled views?

    – Luciano

    14. März 2015 um 20:27 Uhr


  • hast du das schon gelöst?

    – Bojan Kseneman

    25. April 2015 um 19:32 Uhr

In diesem SDK-Beispiele Es gibt ein vollständiges Beispiel, das jedoch eine Layoutdatei für beide LayoutManager verwendet

Um beim Umschalten des Layouts die Scrollposition beizubehalten, nutzten sie diese Funktion

public void setRecyclerViewLayoutManager(LayoutManagerType layoutManagerType) {
    int scrollPosition = 0;

    // If a layout manager has already been set, get current scroll position.
    if (mRecyclerView.getLayoutManager() != null) {
        scrollPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager())
                .findFirstCompletelyVisibleItemPosition();
    }

    switch (layoutManagerType) {
        case GRID_LAYOUT_MANAGER:
            mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT);
            mCurrentLayoutManagerType = LayoutManagerType.GRID_LAYOUT_MANAGER;
            break;
        case LINEAR_LAYOUT_MANAGER:
            mLayoutManager = new LinearLayoutManager(getActivity());
            mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
            break;
        default:
            mLayoutManager = new LinearLayoutManager(getActivity());
            mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
    }

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.scrollToPosition(scrollPosition);
}

  • Ich weiß, dass diese Antwort lange her ist. Ich sehe, dass die aktuelle Beispielseite nicht gefunden wurde. Bitte informieren Sie mich, wenn es ein vollständiges Beispiel gibt

    – Dr. Mido

    17. März 2019 um 9:17 Uhr

  • Sieh dir das an android.googlesource.com/platform/development/+/77b5d39/samples/…

    – Mohammad Yahia

    17. März 2019 um 14:45 Uhr

  • Was ist isViewWithCatalog wie bekommt man das hin?

    – Ramesh-Sambu

    13. Januar 2018 um 5:59 Uhr

  • @R2R isViewWithCatalog ist eine in dieser Aktivität definierte boolesche Variable, die entscheidet, welches Layout zuerst kommt.

    – Pratik Butani

    13. Januar 2018 um 6:10 Uhr

  • Ja, das habe ich als Argument des Konstruktors übergeben. @SavaDimitrijević

    – Pratik Butani

    19. Februar 2019 um 11:15 Uhr


  • Das macht Sinn. Danke für die Antwort!

    – Sava Dimitrijević

    19. Februar 2019 um 11:16 Uhr

  • Danke für deine positive Bewertung: jetzt sind Q/A beide gleich 32:32 😀 @SavaDimitrijević

    – Pratik Butani

    19. Februar 2019 um 11:18 Uhr


Benutzer-Avatar
Benutzer3377402

Ich denke, nach dem Scrollen und Zurückwechseln in die Rasteransicht wird das erste Element nicht neu erstellt. Ich habe das per Override gelöst getItemViewType() und die Layout-Dateien aufblasen onCreateViewHolder entsprechend.

1010860cookie-checkAndroid RecyclerView: Ändern Sie die Layoutdatei LIST in GRID onOptionItemSelected

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy