2016-04-14 6 views
3

いずれかをクリックすると、すべてのアイテムのテキストの色を変更したいと思います。私の問題は、色が目に見えるアイテムだけで変化していることです。目に見えないアイテムの色はまったく変わりません。RecyclerView ViewHolderをすべて入手するには?

新規: また、クリックしたアイテムの色を変更する方法を知りたいと思います。

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

答えて

1

のように、それがテストされていない場合trueに設定し、onBindViewHolder方法でnotifiyDatasetChanged()

を呼び出すonclicklistenerでは、追加します!

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

店このprivate boolean clicked = false;ようなあなたのアダプタクラス内のフラグ。この

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

ありがとうございます、それは仕事です。私は新しいアイデアを持っている、私は現在のアイテムをクリックしたい、現在のテキストの色だけchange.Ohtersは変更されません。コードを変更するには? –

+0

他の回答を見る –

2

notifyDatasetChanged()表示可能なすべてのビューをアニメーション化する場合は、その兄弟方法は機能しません。 アニメーションを作成するには、データソースを更新できますが、notifyDatasetChanged()を呼び出すことはできません。代わりに、すべてのViewHolderを取得してアニメーション化します。スクロールでは、再バインドされたアイテムはすべて正しい状態になります。これは、Ralph Bergmannのようなコードを記述することで実行できます。

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:テストされていないコードですが、それは動作するはずです。

関連する問題