0

klickte ich für die Anzeige Liste der Elemente eine Android-Anwendung entwickle dies ist mein Code:ändern Hintergrundfarbe von ViewItem in RecyclerView.Adapter, wenn ein anderes Element

public class CategoryAdapter extends 
    RecyclerView.Adapter<CategoryAdapter.CategoryAdapterViewHolder> { 

    private String[] categoriesData; 
    private int numberOfCategories; 
    private CategoriesListListener cOnClickListener; 

    public interface CategoriesListListener { 
    void onCategoryItemClick(int categoryItemIndex, int height, int width, 
     View view); 
    } 

    public CategoryAdapter(int numberOfCategories, CategoriesListListener listener) { 
    this.numberOfCategories = numberOfCategories; 
    cOnClickListener = listener; 
    } 

    public class CategoryAdapterViewHolder extends RecyclerView.ViewHolder 
      implements View.OnClickListener{ 


    public final TextView categoryTextView; 
    public int adapterCounter; 
    public CategoryAdapter categoryAdapter; 


    public void setCounter(int counter){ 
     adapterCounter = counter; 
    } 

    public void setCategoryAdapter(CategoryAdapter categoryAdapter){ 
     this.categoryAdapter = categoryAdapter; 
    } 

    public CategoryAdapterViewHolder(View view) { 
     super(view); 
     categoryTextView = (TextView) view.findViewById(R.id.category_name); 
     itemView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view){ 

     int clickedPosition = getAdapterPosition(); 
     int height = view.getHeight(); 
     int width = view.getWidth(); 
     cOnClickListener.onCategoryItemClick(clickedPosition, height, width, view); 
     } 
    } 

    @Override 
public CategoryAdapterViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    Context context = viewGroup.getContext(); 
    int layoutIdForListItem = R.layout.category_item; 
    LayoutInflater inflater = LayoutInflater.from(context); 
    boolean shouldAttachToParentImmediately = false; 

    View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately); 
    CategoryAdapterViewHolder categoryAdapterViewHolder = new CategoryAdapterViewHolder(view); 
    categoryAdapterViewHolder.setCounter(getItemCount()); 
    categoryAdapterViewHolder.setCategoryAdapter(this); 
    return categoryAdapterViewHolder; 
    } 

     @Override 
public void onBindViewHolder(CategoryAdapterViewHolder forecastAdapterViewHolder, int position) { 
    String currentCategory = mCategoriesData[position]; 
    forecastAdapterViewHolder.categoryTextView.setText(currentCategory); 
} 

@Override 
public int getItemCount() { 
    if (null == mCategoriesData) return 0; 
    return mCategoriesData.length; 
} 

    public void setCategoriesData(String[] categoriesData) { 
    this.mCategoriesData = categoriesData; 
    notifyDataSetChanged(); 
    } 
} 

wenn ein Artikel der Rückruf des Zuhörers angeklickt wird dies genannt wird Listener wird von einem Fragment implementiert, die verstreicht, um eine Instanz der sich auf die oben CategoryAdapter

public class CategoriesFragment extends Fragment implements 
    CategoryAdapter.CategoriesListListener { 

    //some code here 
    public interface OnCategoryClickListener{ 
     public void onCategoryClick(int position, String name, String 
      description,int height, int width, View view); 
    } 
    //some code here 
    @Override 
    public void onCategoryItemClick(int categoryItemIndex,int height, int 
     width, View view) { 
     cCallback.onCategoryClick(categoryItemIndex, 
        categoriesName[categoryItemIndex], 
     categories[categoryItemIndex], height, width, view); 
    } 

    } 

Dann wird die Activity implementiert, um die im Inneren des interfaceFragment

 public class MainActivity extends AppCompatActivity implements 
       CategoriesFragment.OnCategoryClickListener{ 
       //some code here 
       @Override 
       public void onCategoryClick(int position, String name, String 
        description, int height, int width, View view){ 

          //some code here 
        int finalRaduis = (int)Math.hypot(height/2, width/2); 
        Animator animator = 
     ViewAnimationUtils.createCircularReveal(view, width/2, height/2, 0, 
          finalRaduis);     
    view.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), 
       R.color.colorAccent2)); 
     animator.start(); 
     //some code here 
    } 

Dann im ManActivity nach den view klicken änderte ich erfolgreich die Hintergrundfarbe der Ansicht, aber das Problem kommt, wenn eine neue Ansicht in diesem Fall angeklickt wird die zuvor angeklickt view ‚s Hintergrundfarbe doesn‘ t wechseln Sie zum Standard.

Frage Wie soll ich meinen Code ändern, sodass beim Klicken auf eine neue Ansicht die zuvor angeklickte eine Farbe in die Standardfarbe wechselt?

Antwort

0

Sie können eine Mitgliedvariable clickedPosition mit einem Wert von 0 in der Adapterklasse erstellen. In der onBindViewHolder-Methode können Sie überprüfen, ob clikedPostion == aktuelle Position ist, und dann die Auswahlfarbe auf die Standardfarbe setzen. Call notififydataset änderte Methode von onclick Methode, um die Ansicht zu aktualisieren. Fügen Sie folgenden Code in Adapterklasse

int clickedPosition = -1; 
public void onBindViewHolder(CategoryAdapterViewHolder forecastAdapterViewHolder, int position) { 
    ....... 
    ....... 
    if(clickedPosition == position) { 
     // set selected color 
    } else { 
     // set default color 
    } 
} 

public void onClick(View view){ 

    clickedPosition = getAdapterPosition(); 
    int height = view.getHeight(); 
    int width = view.getWidth(); 
    cOnClickListener.onCategoryItemClick(clickedPosition, height, width, view); 
    notifyDataSetChanged(); 
} 
+0

das ist richtig, aber wie Blick vom Adapter erhalten, wenn nur die Position, die ist es eine Methode implementiert für diesen Zweck? – Siavosh

+0

Sie sollten root layout/view in CategoryAdapterViewHolder und hinzufügen click listener innerhalb bind view holder method und entfernen beim klicken von CategoryAdapterViewHolder klasse – Praveen

+0

können sie bitte ihre lösung in mehr details und ändern sie meinen code, ich bin immer noch verwirrt wie man eine ansicht Artikel Form Adapter durch seine Position – Siavosh

0

Versuchen unten Lösung einige Code in MainActivity Zugabe: -

public class MainActivity extends AppCompatActivity implements 
    CategoriesFragment.OnCategoryClickListener{ 


//Define 
int prevClickPos = -1; 
View prevView = null; 


//some code here 
@Override 
public void onCategoryClick(int position, String name, String 
     description, int height, int width, View view){ 

    //some code here 
    int finalRaduis = (int)Math.hypot(height/2, width/2); 
    Animator animator = 
      ViewAnimationUtils.createCircularReveal(view, width/2, height/2, 0, 
        finalRaduis); 
    view.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), 
      R.color.colorAccent2)); 
    animator.start(); 


    //Change Background Default 
    if(prevClickPos != -1 && prevClickPos != position) { 
     prevView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), 
       R.color.defaultColor)); //Apply Default color 
    } 
    prevClickPos = position; 
    prevView = view; 

    //some code here 
} 
Verwandte Themen