2016-04-14 17 views
3

Onlardan birine tıkladığımda tüm öğelerin metin rengini değiştirmek istiyorum. Sorunum, rengin sadece görünen öğeler üzerinde değişmesidir. Görünmez öğelerin rengi hiç değişmez.Tüm RecyclerView ViewHolder nasıl edinilir?

Yeni: Ayrıca, yalnızca tıklanan öğenin rengini nasıl değiştireceğimi bilmek istiyorum.

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" /> 

cevap

1

o test edilmemiştir gibi eğer eklemek yılında true olarak ayarlayın OnClickListener ve onBindViewHolder yöntemde notifiyDatasetChanged()

çağrı !!! Görülebilir tüm görünümleri animasyon istiyorsanız

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

Mağaza Bu private boolean clicked = false; gibi adaptör sınıfta bir bayrak. Bir bu

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

Teşekkürler, iş bu. Yeni bir fikrim var, mevcut öğeyi tıklatmak istiyorum, yalnızca geçerli metin rengi değişecektir.Onlar değişmez. Kod nasıl değiştirilir? –

+0

diğer yanıtımı gör –

2

notifyDatasetChanged() ve kardeş yöntemleri çalışmaz. Animasyon yapmak için, veri kaynağını güncelleyebilir, ancak notifyDatasetChanged() numaralı telefonu aramazsınız, bunun yerine tüm ViewHolder'ları alırsınız ve bunları kendiniz özelleştirebilirsiniz. Kaydettiğinizde, yeniden bağlanan tüm öğelerin doğru durumu olacaktır. Bu kodları, Ralph Bergmann gönderildiği yere benzer bir kod yazarak yapabilirsiniz.

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: denenmemiş kod, ancak çalışması gerekir.

İlgili konular