2017-01-18 13 views
-1

私はrecyclerviewでcardviewを作成して、単一のカードで4つのtextViewを配置して、同じtextViewをクリックしてtextViewのテキストを変更したい。 これをしようとしているときに、他のカードにも適用されます。私は4枚のカードを持っているし、すべてのカードはtextViewのように持っているように、私はFacebookのようなクリックで好きなようにテキストを変更すると、その後スクロールでより多くのデータを読み込みます。しかし、データをロードした後、私はすでにdefault.Hereでも、新たにロードされたカードの上の変更のTextViewが私のアダプタであるようにすることを見ています:私はcardviewのtextViewのテキストを変更したいと思うandroidのビュー

package common; 
import android.app.Activity; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.res.ColorStateList; 
import android.graphics.Bitmap; 
import android.graphics.Color; 
import android.net.Uri; 
import android.support.customtabs.CustomTabsIntent; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.animation.Animation; 
import android.view.animation.LinearInterpolator; 
import android.view.animation.RotateAnimation; 
import android.widget.AbsListView; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.android.volley.toolbox.ImageLoader; 
import com.android.volley.toolbox.NetworkImageView; 
import com.rate.sky.rate.LoginActivity; 
import com.rate.sky.rate.R; 
import com.squareup.picasso.Picasso; 

import java.util.ArrayList; 
import java.util.List; 

import static android.R.attr.targetActivity; 
import static android.R.attr.width; 
import static com.rate.sky.rate.R.attr.height; 
import static com.rate.sky.rate.R.attr.title; 

/** 
* Created by sky on 12/18/2016. 
*/ 

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> { 

    UserAuth auth; 
    private Activity activity; 
    private ImageLoader imageLoader; 
    private ArrayList<ListItem> list; 
    ListItem listItem; 


    public CardAdapter(Activity activity,ArrayList<ListItem> listVal){ 
     super(); 
     this.activity = activity; 
     this.list=listVal; 

    } 

    public ListItem getItem(int position) { 
     return list.get(position); 
    } 

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


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

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     listItem = getItem(position); 
     try { 
      imageLoader = CustomVolleyRequest.getInstance(activity.getApplicationContext()) 
        .getImageLoader(); 
      imageLoader.get(listItem.getUrl(), ImageLoader.getImageListener(holder.thumbnail, 
        android.R.drawable.ic_dialog_alert, 
        android.R.drawable.ic_dialog_alert)); 
      holder.thumbnail.setImageUrl(listItem.getUrl(), imageLoader); 
      holder.textViewContent.setText(listItem.getTitle()); 
     }catch (Exception e){ 
      Log.d("Error--",e.toString()); 
     } 
    } 

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

    class ViewHolder extends RecyclerView.ViewHolder { 
     public NetworkImageView thumbnail; 
     public ImageView imageShare, imageComment, imageVote, imageDownvote; 
     public TextView textViewVoteButton, textViewDownVoteButton, textViewCommentButton, textViewContent; 
     public TextView txtVoteCount, txtDownVoteCount, txtCommentCount; 
     public Button rateButton; 
     CustomTabsIntent customTabsIntent; 
     CustomTabsIntent.Builder intentBuilder; 


     public ViewHolder(final View itemView) { 
      super(itemView); 
      //Toast.makeText(itemView.getContext(),"Hello",Toast.LENGTH_LONG).show(); 
      auth = new UserAuth(itemView.getContext()); 
      thumbnail = (NetworkImageView) itemView.findViewById(R.id.thumbnail); 
      rateButton = (Button) itemView.findViewById(R.id.button2); 
      imageShare = (ImageView) itemView.findViewById(R.id.imageView4); 
      imageComment = (ImageView) itemView.findViewById(R.id.imageViewComment); 
      textViewContent = (TextView) itemView.findViewById(R.id.textView); 
      textViewVoteButton = (TextView) itemView.findViewById(R.id.textView3); 
      textViewDownVoteButton = (TextView) itemView.findViewById(R.id.textView5); 
      textViewCommentButton = (TextView) itemView.findViewById(R.id.textView4); 
      imageVote = (ImageView) itemView.findViewById(R.id.imageViewVote); 
      imageDownvote = (ImageView) itemView.findViewById(R.id.imageViewDownvote); 
      txtVoteCount = (TextView) itemView.findViewById(R.id.textViewVoteCount); 
      txtDownVoteCount = (TextView) itemView.findViewById(R.id.textViewDownvote); 
      txtCommentCount = (TextView) itemView.findViewById(R.id.textViewComments); 
      /*Custome chrome tab view*/ 
      intentBuilder = new CustomTabsIntent.Builder(); 
      // Set toolbar(tab) color of your chrome browser 
      intentBuilder.setToolbarColor(ContextCompat.getColor(itemView.getContext(), R.color.colorPrimary)); 
      customTabsIntent = intentBuilder.build(); 
      /*End*/ 
      /* 
       Changing the text of textview 
      */ 
      imageVote.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (auth.getLoginWith().equals("G") || auth.getLoginWith().equals("F")) { 
         vote(); 
        } else { 
         Intent intent = new Intent(v.getContext(), LoginActivity.class); 
         v.getContext().startActivity(intent); 
        } 
       } 
      }); 

      textViewVoteButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (auth.getLoginWith().equals("G") || auth.getLoginWith().equals("F")) { 
         vote(); 
        } else { 
         Intent intent = new Intent(v.getContext(), LoginActivity.class); 
         v.getContext().startActivity(intent); 
        } 
       } 
      }); 



     } 

     public void vote() { 
      RotateAnimation anim = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
      anim.setInterpolator(new LinearInterpolator()); 
      anim.setDuration(400); 
      imageVote.startAnimation(anim); 
      ColorStateList mList = textViewVoteButton.getTextColors(); 
      int color = mList.getDefaultColor(); 
      if (color == Color.BLUE) { 
       textViewVoteButton.setTextColor(Color.GRAY); 
      } else { 
       textViewVoteButton.setTextColor(Color.BLUE); 

      } 
     } 


    } 
} 
+0

問題はコード内にあります... – Selvin

+0

返信ありがとうございます@セルヴィンしかし、どのような種類の問題がありますことをお勧めできますか? –

+1

問題は、あなたが質問する方法を知らないということです。プログラマは魔法の呪いを使用しないので、コードなしでどこに問題があるのか​​は分かりません – Selvin

答えて

1

RecyclerViewは、あなたがスクロールするとき、それは既存のビューを取ることを意味し、ビューをリサイクルし、それをリストの別のエントリ用に再使用します。そのビューは魔法のようにリセットされません。以前のエントリに使用されたときと同じままになります。

voteメソッドでは、ユーザーがエントリをクリックしたときにテキストビューの色を変更するように見えますが、別のエントリで再利用されたときに色をデフォルト状態にリセットしません。だから、これまでどんな色であっても残っています。

あなたは、エントリがすでに(ないviewholderまたはビューではなく、どこかにあなたのモデルで)に投票して、あなたのonBindViewHolder方法でごとビューを正しい色を設定されているものを何とか追跡する必要があります。

基本的に、あなた常には手動onBindViewHolder方法でビューに加えすべての変更をリセットする必要があります。

関連する問題