2016-04-14 8 views
3

Ich möchte die Textfarbe aller Elemente ändern, wenn ich auf einen von ihnen klicke. Mein Problem ist, dass sich die Farbe nur bei sichtbaren Objekten ändert. Die Farbe der unsichtbaren Gegenstände ändert sich überhaupt nicht.Wie bekomme ich den RecyclerView ViewHolder?

Neu: Auch ich würde gerne wissen, wie man nur die Farbe des angeklickten Artikels ändert.

EffectPanelRecyclerViewAdapter.java:

public class EffectPanelRecyclerViewAdapter extends RecyclerView.Adapter<EffectPanelRecyclerViewAdapter.ViewHolder> { 
private ArrayList<String> mDataset = null; 
private MyItemClickListener mItemClickListener; 

public EffectPanelRecyclerViewAdapter(ArrayList<String> datats) { 
    mDataset = datats; 
} 


public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    public TextView mTextView; 
    private MyItemClickListener mListener; 

    public ViewHolder(View v, MyItemClickListener listener) { 
     super(v); 
     mListener = listener; 
     mTextView = (TextView) v.findViewById(R.id.tv); 
     v.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (mListener != null) { 
      Log.d("hello", "getAdapterPosition=" + getAdapterPosition()); 
      mListener.onItemClick(v, getAdapterPosition()); 
     } 
    } 

} 

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

public interface MyItemClickListener { 
    public void onItemClick(View view, int postion); 
} 

/** 
* ViewHolder 
*/ 
@Override 
public EffectPanelRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // create a new view 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); 
    // set the view's size, margins, paddings and layout parameters 
    ViewHolder vh = new ViewHolder(v, mItemClickListener); 
    Log.d("hello", "onCreateViewHolder"); 
    return vh; 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, final int position) { 
    Log.d("hello", "onBindViewHolder,position=" + position); 
    ViewHolder mHolder = (ViewHolder) holder; 
    mHolder.mTextView.setText(mDataset.get(position)); 
    mHolder.mTextView.setTag(position); 
    mHolder.mTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mItemClickListener.onItemClick(v, position); 
     } 
    }); 
} 

public void setOnItemClickListener(MyItemClickListener listener) { 
    this.mItemClickListener = listener; 
} 

}

MainActivity.java:

public class MainActivity extends AppCompatActivity { 

private ArrayList<String> mDatas; 
private RecyclerView mRecyclerView; 
private EffectPanelRecyclerViewAdapter mAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initDatas(); 
    mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview_horizontal); 
    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); 
    linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); 
    mRecyclerView.setLayoutManager(linearLayoutManager); 
    mAdapter = new EffectPanelRecyclerViewAdapter(mDatas); 
    mRecyclerView.setAdapter(mAdapter); 
    mAdapter.setOnItemClickListener(new EffectPanelRecyclerViewAdapter.MyItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      Toast.makeText(MainActivity.this, "position=" + position, Toast.LENGTH_SHORT).show(); 
      //I want to change all item text color.How to do it ? 
      for (int i = 0; i < mAdapter.getItemCount(); i++) { 
       EffectPanelRecyclerViewAdapter.ViewHolder viewHolder = (EffectPanelRecyclerViewAdapter.ViewHolder) mRecyclerView.findViewHolderForAdapterPosition(i); 
       if (viewHolder != null) { 
        viewHolder.mTextView.setTextColor(Color.RED); 
        Log.d("hellotom", "if i=" + i); 
       } else { 
        Log.d("hellotom", "else i=" + i); 
       } 
      } 
     } 
    }); 
} 

private void initDatas() { 
    mDatas = new ArrayList(); 
    for (int i = 0; i < 10; i++) { 
     mDatas.add(i, "i=" + i); 
    } 
} 

}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/id_recyclerview_horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_centerVertical="true" 
    android:paddingBottom="18dp" 
    android:paddingTop="15dp" 
    android:scrollbars="none" /> 

item.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 

<TextView 
    android:id="@+id/tv" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:drawableTop="@drawable/ic_launcher_select" 
    android:textColor="@color/select_color" 
    android:gravity="center" 
    android:text="@string/app_name" /> 

Antwort

1

es nicht getestet !!!

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

    private ArrayList<DataClass> mDataset = null; 

    public EffectPanelRecyclerViewAdapter(ArrayList<DataClass> datats) { 
     mDataset = datats; 
    } 

    /** 
    * ViewHolder 
    */ 
    @Override 
    public EffectPanelRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
                     int viewType) { 
     // create a new view 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); 
     // set the view's size, margins, paddings and layout parameters 
     ViewHolder vh = new ViewHolder(v); 
     Log.d("hello", "onCreateViewHolder"); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 

     Log.d("hello", "onBindViewHolder,position=" + position); 
     holder.mTextView.setText(mDataset.get(position).text); 
     holder.mTextView.setTextColor(mDataset.get(position).clicked ? Color.RED : Color.BLUE); 
     holder.mTextView.setTag(position); 
     holder.mTextView.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       mDataset.get(position).clicked = true; 
       notifyItemChanged(position); 
      } 
     }); 
    } 

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


    private static class DataClass { 

     public String text; 
     public boolean clicked; 
    } 


    private static class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView mTextView; 

     public ViewHolder(View v) { 
      super(v); 
      mTextView = (TextView) v.findViewById(R.id.tv); 
     } 
    } 
} 
1

Shop ein Flag in Ihrem Adapter-Klasse wie diese private boolean clicked = false;. In der OnClickListener es true gesetzt und notifiyDatasetChanged()

Im onBindViewHolder Methode hinzufügen nennen, wenn wie diese

if (clicked) 
    viewHolder.mTextView.setTextColor(Color.RED); 
else 
    viewHolder.mTextView.setTextColor(Color.BLUE); 
+0

Danke, es ist Arbeit. Ich habe eine neue Idee, ich möchte auf das aktuelle Element klicken, nur die aktuelle Textfarbe wird geändert.Ohter ändern sich nicht. Wie ändere ich den Code? –

+0

sehe meine andere Antwort –

2

notifyDatasetChanged() und seine Geschwister Methoden funktionieren nicht, wenn Sie alle sichtbaren Ansichten animieren möchten. Um zu animieren, können Sie die Datenquelle aktualisieren, aber nicht notifyDatasetChanged() aufrufen, stattdessen erhalten Sie alle ViewHolder und animieren sie selbst. Beim Scrollen haben alle neu verknüpften Objekte den richtigen Status, was Sie tun können, indem Sie einen ähnlichen Code wie Ralph Bergmann schreiben.

AnimatorSet set = new AnimatorSet(); 
ArrayList<Animator> animators = new ArrayList<>(mRecyclerView.getChildCount()); 
for (int i = 0, size = mRecyclerView.getChildCount(); i < size; i++) { 
    RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(mRecyclerView.getChildAt(i)); 
    if (holder != null) { 
     // do stuff like this 
     ObjectAnimator animator = ObjectAnimator.ofFloat(holder.itemView, "alpha", 0F); 
     animators.add(animator); 
    } 
} 
set.playTogether(animators); 
set.setDuration(200); 
set.start(); 

PS: Ungeprüfte Code, aber es sollte funktionieren.