2017-04-24 3 views
0

Ich habe eine RecyclerView und ich habe 9 Elemente darin und wenn ich auf ein Element klicken, sollte es ausgewählt werden, aber wenn ich ein anderes Element auswählen sollte es ausgewählt werden und das andere Element sollte automatisch nicht ausgewählt werden.RecyclerView-Adapter klicken nicht funktioniert nach Bedarf

Was mache ich falsch, jede Hilfe ist bemerkenswert, danke.

Hier ist mein Adapter Code

class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.DataViewHolder> { 

    private final int mItemCount; 
    List<ServicesMenuModel> mServiceList; 
    SparseBooleanArray mArray = new SparseBooleanArray(); 
    int pos; 

    ItemAdapter(int itemCount, List<ServicesMenuModel> mServiceList) { 
     mItemCount = itemCount; 
     this.mServiceList = mServiceList; 
    } 

    @Override 
    public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_item_list_dialog_item6, parent, false); 
     return new DataViewHolder(v); 
    } 

    public void changeAt(int position, DataViewHolder holder) { 
     mArray.delete(position); 
     notifyItemChanged(position); 
     holder.mServiceText.setSelected(false); 
    } 

    @Override 
    public void onBindViewHolder(final DataViewHolder holder, int position) { 
     holder.mServiceText.setText(mServiceList.get(position).getMenuText()); 

     holder.mServiceText.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       holder.mServiceText.setSelected(mArray.get(holder.getAdapterPosition(), false)); 
       pos = holder.getAdapterPosition(); 

       //When same item is clicked 
       if (mArray.get(holder.getAdapterPosition(), false)) { 
        mArray.delete(pos); 
        holder.mServiceText.setSelected(false); 
       } else 
       //When new item is selected 
       { 

        for (int i = 0; i < mServiceList.size(); i++) { 
         changeAt(i, holder);//checking to remove other items 
        } 
        mArray.put(holder.getAdapterPosition(), true); 
        holder.mServiceText.setSelected(true); 
       } 

       if (mListener != null) { 
        mListener.onItemClicked(holder.getAdapterPosition()); 
        dismiss(); 
       } 
      } 
     }); 
    } 

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

    class DataViewHolder extends RecyclerView.ViewHolder { 
     TextView mServiceText; 

     DataViewHolder(View v) { 
      super(v); 
      mServiceText = (TextView) v.findViewById(R.id.text); 
     } 
    } 
} 
+0

ist es die BottomSheetDialogFragment Zuhörer, können wir es für jetzt ignorieren –

Antwort

1

Ich nehme an, Ihre Anforderung ist es, ein Element auf einmal auszuwählen. Ich würde die folgende Methode empfehlen, anstatt eine Reihe von Booleschen zu halten.

Deklarieren Sie eine Variable, die den Index des zuletzt ausgewählten Elements in der Adapterklasse enthält.

int mLastSelectedIndex = -1; 

Innerhalb des ViewHolder definieren die onClick Methode wie folgt.

void setUpOnClick(final int position) {  
    boolean selection = position == mLastSelectedPosition; 
    mServiceText.setSelected(selection); 

    mServiceText.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int tempOldIndex = mLastSelectedPosition; 
      mLastSelectedPosition = position; 

      if (tempOldIndex >= 0) { 
       notifyItemChanged(tempOldIndex); 
      } 
      notifyItemChanged(position); 

      // your regular code 
     } 
    } 
} 

endlich es innerhalb rufen onBindViewHolder

@Override 
public void onBindViewHolder(final DataViewHolder holder, int position { 
    holder.setUpOnClick(position); 

    // your regular code 
} 
+0

Für einzelne Artikelauswahl es funktioniert, aber was tun, wenn ich auf dem gleichen Element klicken , Ich muss die Sicht weg –

+0

machen @RakshitNawani kann sein, dass Sie so versuchen können. Boolesche Auswahl = Position == mLastSelectedPosition; Boolean isSelected = mServiceText.isSelected(); mServiceText.setSelected (Auswahl &&! IsAusgewählt); –

1

Dies ist sicherlich ein falscher Weg, dies zu tun:

holder.mServiceText.setSelected(false); 

Da diese ViewHolder weitere Elemente Ihrer RecyclerView wird auch wiederverwendet, was machen andere Elemente von RecyclerView werden ausgewählt, wenn Sie vor- und zurückblättern.

Stattdessen deklarieren Sie ein Feld in ViewHolder, z. boolean isSelected und mutieren das Feld:

holder.isSelected = true; 

Dann in onBindViewHolder() zeigen den Inhalt dieser boolean abhängig:

if (holder.isSelected) { 
    // display selected content 
} else { 
    // display unselected content 
} 
0

teste ich nicht, aber es funktionieren würde. Hauptschlüssel verwendet Listeninstanz.

Ich hoffe, es ist hilfreich. Auch wenn Ihr Listener einige UI-Änderungen vornehmen würde, würde ich notify ~ function an den Ort setzen, an dem Ihr Adapter benutzt wird.

package net.deali.ssmarket.view; 

import android.support.v7.widget.RecyclerView; 
import android.util.SparseBooleanArray; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import net.deali.ssmarket.R; 

import java.util.List; 

import static android.media.CamcorderProfile.get; 

/** 
* Created by soochun on 2017-04-24. 
*/ 

class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.DataViewHolder> { 

    List<ServicesMenuModel> mServiceList; 

    ItemAdapter(int itemCount, List<ServicesMenuModel> mServiceList) { 
     this.mServiceList = mServiceList; 
    } 

    @Override 
    public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_item_list_dialog_item6, parent, false); 
     return new DataViewHolder(v); 
    } 

    public void changeAt(int position, DataViewHolder holder) { 
     notifyItemChanged(position); 
     holder.mServiceText.setSelected(false); 
    } 

    @Override 
    public void onBindViewHolder(final DataViewHolder holder, final int position) { 
     final ServicesMenuModel item = mServiceList.get(position); 
     holder.mServiceText.setText(item.getMenuText()); 
     holder.mServiceText.setSelected(item.isSelected()); 
     holder.mServiceText.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       boolean setValue = !item.isSelected(); 
       item.setSelected(setValue); 
       notifyItemChanged(position, item); 

       //if even one item is selected, should make other items make unselected. 
       if (setValue) { 
        int i = 0; 
        for (ServicesMenuModel servicesMenuModel : mServiceList) { 
         if (i != position) { 
          servicesMenuModel.setSelected(false); 
         } 
         i++; 
        } 
        notifyDataSetChanged(); //if recyclerView move top postion try to use notifyItemRangeChanged(0, mServiceList.size()); 
       } 

       if (mListener != null) { 
        mListener.onItemClicked(position); 
        dismiss(); 
       } 
      } 
     }); 
    } 

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

    class DataViewHolder extends RecyclerView.ViewHolder { 
     TextView mServiceText; 

     DataViewHolder(View v) { 
      super(v); 
      mServiceText = (TextView) v.findViewById(R.id.text); 
     } 
    } 

    class ServicesMenuModel { 
     String menuText; 
     boolean isSelected; 

     public String getMenuText() { 
      return menuText; 
     } 

     public void setMenuText(String menuText) { 
      this.menuText = menuText; 
     } 

     public boolean isSelected() { 
      return isSelected; 
     } 

     public void setSelected(boolean selected) { 
      isSelected = selected; 
     } 
    } 
} 
Verwandte Themen