2017-04-10 3 views
-2

J'ai un bouton like dans mon RecyclerView, ce que je veux est lorsque l'utilisateur a frappé le bouton like pour la 1ère fois, la couleur de fond du bouton changer pour red couleur, et lorsque le même utilisateur a frappé le bouton like, le bouton changera Retour à la couleur par défaut qui est white.Comment changer la couleur du bouton quand étant clic, et revenir à des couleurs par défaut dans le prochain clic?

j'ai vérifié pour quelques SO question, mais toujours havent obtenir ce que je want.So loin ma solution est comme ci-dessous, ne marche pas produire une erreur mais quand cliqué sur le bouton, rien ne se passe.

likeButton =(Button) view.findViewById(R.id.likeButton); 

//here for user like the post 
holder.likeButton.setOnClickListener(new View.OnClickListener() { 
      boolean clicked = true; 

      @Override 
      public void onClick(View v) { 
       if(!clicked){ 
        holder.likeButton.setBackgroundColor(Color.RED); 
        clicked = true; 

        //here i will update the database 

       }else{ 
        holder.likeButton.setBackgroundColor(Color.WHITE); 
        clicked = false; 
        //here i will update the database 
       } 


      } 
     }); 

J'ai vérifié SO answer aussi, donc je modifié mon code comme ci-dessous, mais rien ne se passe lorsque le bouton est cliqué.

holder.likeButton.setBackgroundColor(Color.WHITE); 
holder.likeButton.setOnClickListener(new View.OnClickListener() { 
     ValueAnimator buttonColorAnim = null; 

     @Override 
     public void onClick(View v) { 
      if(buttonColorAnim != null){ 
       buttonColorAnim.reverse(); 
       buttonColorAnim = null; 
       //here i will update the database 
      }else{ 
       final Button button = (Button) v;//here is the line I dont undestand 
       buttonColorAnim = ValueAnimator.ofObject(new ArgbEvaluator(), Color.RED, Color.WHITE); 

       buttonColorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
        @Override 
        public void onAnimationUpdate(ValueAnimator animator) { 
         // set the background color 
         button.setBackgroundColor((Integer) animator.getAnimatedValue()); 
        } 
        //here i will update the database 
       }); 

       buttonColorAnim.start(); 
      } 
     } 
    }); 

Quelqu'un s'il vous plaît souligner ce que je suis absent, ce que je veux est le bouton de changement de couleur quand programme étant cliquez pour la 1ère fois, et revenir par défaut pour le prochain clic (ce qui évite plusieurs comme d'un même utilisateur) .

+0

Votre premier exemple semble être correct, cependant, votre variable 'clicked' a valeur attribuée'on' , ce qui signifie que '! clicked' est toujours faux et que votre code n'est jamais exécuté. – MatusMak

+0

donc je dois attribuer false pour le 1er exemple? @MatusMak – ken

+0

raison de downvote? – ken

Répondre

0

Salut à essayer cet espoir cela peut vous aider ...

En XML

<Button 
    android:id="@+id/btnClick" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/white" 
    android:text="click"/> 

Dans la classe d'adaptateur

boolean click = true; 


     holder.btnClick.setTag(position); 
     holder.btnClick.setId(position); 
     holder.btnClick.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if (click) { 
        holder.btnClick.setBackgroundColor(Color.RED); 
        click = false; 
       } else { 
        holder.btnClick.setBackgroundColor(Color.WHITE); 
        click = true; 
       } 
       notifyDataSetChanged(); 
      } 
     }); 
0

Vous devez créer un fichier de sélection. Créez un fichier dans le dossier drawable comme color_change.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_pressed="true" 
    android:drawable="@color/button_pressed"/> <!-- pressed --> 
<item android:state_focused="true" 
    android:drawable="@color/button_focused"/> <!-- focused --> 
<item android:drawable="@color/button_default"/> <!-- default --> 
</selector> 

et déclarer le bouton comme celui-ci

<Button 
    android:id="@+id/button1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/color_change" 
    android:text="Click Me" /> 
0

Au lieu de clicked ou non état, faire et utiliser la condition de vous mettre à jour la base de données pour like et dislike opération. Donc, dans click-listener obtenir des données utilisateur précédemment ou non, puis modifier l'arrière-plan et mettre à jour la base de données selon le nouveau clic.

0

Essayez d'ajouter cette ligne à votre fichier row.xml dans la mise en page principale:

android:descendantFocusability="blocksDescendants" 
+0

celui-ci est pour quoi ?? – ken

+0

Pour rendre le bouton cliquable, il suffit de mettre l'accent sur le bouton plutôt que sur la liste des vôtres. L'as tu essayé ! –

+0

Je viens d'essayer.mais pas d'effet – ken

0

Jetez un oeil à ce sujet. Ici, j'ai changé la couleur du texte du bouton sur clic. Pour la première fois, tous les boutons apparaissent en blanc et, après un clic, ils basculent entre le rouge et le blanc comme prévu. -

//LikeAdapter.java

public class LikeAdapter extends RecyclerView.Adapter<LikeAdapter.LikeHolder> { 

    public LikeAdapter() { 

    } 

    @Override 
    public LikeAdapter.LikeHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.like_item,parent,false); 
     return new LikeHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final LikeAdapter.LikeHolder holder, int position) { 

     holder.red_btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       if (holder.red_btn.getVisibility() == View.VISIBLE) { 
        holder.red_btn.setVisibility(View.GONE); 
        holder.white_btn.setVisibility(View.VISIBLE); 
       } else { 
        holder.red_btn.setVisibility(View.VISIBLE); 
        holder.white_btn.setVisibility(View.GONE); 
       } 
      } 
     }); 

     holder.white_btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (holder.white_btn.getVisibility() == View.VISIBLE) { 
        holder.red_btn.setVisibility(View.VISIBLE); 
        holder.white_btn.setVisibility(View.GONE); 
       } else { 
        holder.red_btn.setVisibility(View.GONE); 
        holder.white_btn.setVisibility(View.VISIBLE); 
       } 

      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return 5; 
    } 

    public class LikeHolder extends RecyclerView.ViewHolder { 
     private Button red_btn, white_btn; 
     public LikeHolder(View itemView) { 
      super(itemView); 
      red_btn = (Button) itemView.findViewById(R.id.red_btn); 
      white_btn = (Button) itemView.findViewById(R.id.white_btn); 
      red_btn.setBackgroundColor(Color.RED); 
      white_btn.setBackgroundColor(Color.WHITE); 

     } 
    } 
} 

//like_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp"> 



    <Button 
     android:id="@+id/red_btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="Red"/> 

    <Button 
     android:id="@+id/white_btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="White"/> 



</RelativeLayout>