2016-08-25 32 views
4

私は画像編集アプリケーションでサムネイルを表示するためにRecyclerViewを使用しています。ImageView(サムネイル)とtextViewの各項目の項目。は現在選択されていますクリックするとサムネイルが表示されます.SOに関連するすべての記事は表示されますが、より良い解決策は見つかりませんでした。RecyclerViewで選択した項目を強調表示する方法

マイアダプタクラス

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

    private Context mContext; 
    private List<Type> mDataSet; 
    private Uri selectedPhoto; 

    public enum Type { 
     Original, 
     Grayscale, 
     Sepia, 
     Contrast, 
     Invert, 
     Pixel, 
     Sketch, 
     Swirl, 
     Brightness, 
     Vignette 
    } 

    public FiltersAdapter(Context context, List<Type> dataSet, Uri selectedPhoto) { 
     mContext = context; 
     mDataSet = dataSet; 
     this.selectedPhoto = selectedPhoto; 
    } 

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

    @Override 
    public void onBindViewHolder(FiltersAdapter.ViewHolder holder, int position) { 
     switch (mDataSet.get(position)) { 
      case Original: 
       holder.image.setImageResource(R.drawable.no_filter); 
       break; 
      case Grayscale: 
       Picasso.with(mContext) 
         .load(R.drawable.no_filter) 
         .transform(new GrayscaleTransformation()) 
         .into(holder.image); 
       break; 
      case Sepia: 
       Picasso.with(mContext) 
         .load(R.drawable.no_filter) 
         .transform(new SepiaFilterTransformation(mContext)) 
         .into(holder.image); 
       break; 
      case Contrast: 
       Picasso.with(mContext) 
         .load(R.drawable.no_filter) 
         .transform(new ContrastFilterTransformation(mContext, 2.0f)) 
         .into(holder.image); 
       break; 
      case Invert: 
       Picasso.with(mContext) 
         .load(R.drawable.no_filter) 
         .transform(new InvertFilterTransformation(mContext)) 
         .into(holder.image); 
       break; 
      case Pixel: 
       Picasso.with(mContext) 
         .load(R.drawable.no_filter) 
         .transform(new PixelationFilterTransformation(mContext, 20)) 
         .into(holder.image); 
       break; 
      case Sketch: 
       Picasso.with(mContext) 
         .load(R.drawable.no_filter) 
         .transform(new SketchFilterTransformation(mContext)) 
         .into(holder.image); 
       break; 
      case Swirl: 
       Picasso.with(mContext) 
         .load(R.drawable.no_filter) 
         .transform(new SwirlFilterTransformation(mContext, 0.5f, 1.0f, new PointF(0.5f, 0.5f))) 
         .into(holder.image); 
       break; 
      case Brightness: 
       Picasso.with(mContext) 
         .load(R.drawable.no_filter) 
         .transform(new BrightnessFilterTransformation(mContext, 0.5f)) 
         .into(holder.image); 
       break; 
      case Vignette: 
       Picasso.with(mContext) 
         .load(R.drawable.no_filter) 
         .transform(new VignetteFilterTransformation(mContext, new PointF(0.5f, 0.5f), 
           new float[]{0.0f, 0.0f, 0.0f}, 0f, 0.75f)) 
         .into(holder.image); 
       break; 
      default: 
       holder.image.setImageResource(R.drawable.no_filter); 
       break; 

     } 
     holder.title.setText(mDataSet.get(position).name()); 
    } 

    @Override 
    public void onViewAttachedToWindow(ViewHolder holder) { 
     super.onViewAttachedToWindow(holder); 

    } 

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

    @Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    static class ViewHolder extends RecyclerView.ViewHolder { 

     public ImageView image; 
     public TextView title; 

     ViewHolder(View itemView) { 
      super(itemView); 
      image = (ImageView) itemView.findViewById(R.id.thumbnailImage); 
      title = (TextView) itemView.findViewById(R.id.title); 
     } 


    } 
} 

断片コード

horizontalFilters = (RecyclerView) mView.findViewById(R.id.rvHorizontal); 
    LinearLayoutManager horizontalLayoutManagaer 
      = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false); 
    horizontalFilters.setLayoutManager(horizontalLayoutManagaer); 

    List<Type> dataSet = new ArrayList<>(); 
    dataSet.add(Type.Original); 
    dataSet.add(Type.Grayscale); 
    dataSet.add(Type.Sepia); 
    dataSet.add(Type.Contrast); 
    dataSet.add(Type.Invert); 
    dataSet.add(Type.Pixel); 
    dataSet.add(Type.Sketch); 
    dataSet.add(Type.Swirl); 
    dataSet.add(Type.Brightness); 
    dataSet.add(Type.Vignette); 

    horizontalFilters.setAdapter(new FiltersAdapter(act, dataSet, selectedPhotoUri)); 

    horizontalFilters.addOnItemTouchListener(new RecyclerClick(act, horizontalFilters, new RecyclerClickListener() { 
     @Override 
     public void onClick(View view, int position) { 
      switch (position){ 
       case 0: 
        photo.setImageDrawable(drawable); 
        break; 
       case 1: 
        Picasso.with(act) 
          .load(selectedPhotoUri) 
          .transform(new GrayscaleTransformation()) 
          .into(photo); 
        break; 
       case 2: 
        Picasso.with(act) 
          .load(selectedPhotoUri) 
          .transform(new SepiaFilterTransformation(act)) 
          .into(photo); 
        break; 
       case 3: 
        Picasso.with(act) 
          .load(selectedPhotoUri) 
          .transform(new ContrastFilterTransformation(act, 2.0f)) 
          .into(photo); 
        break; 
       case 4: 
        Picasso.with(act) 
          .load(selectedPhotoUri) 
          .transform(new InvertFilterTransformation(act)) 
          .into(photo); 
        break; 
       case 5: 
        Picasso.with(act) 
          .load(selectedPhotoUri) 
          .transform(new PixelationFilterTransformation(act, 20)) 
          .into(photo); 
        break; 
       case 6: 
        Picasso.with(act) 
          .load(selectedPhotoUri) 
          .transform(new SketchFilterTransformation(act)) 
          .into(photo); 
        break; 
       case 7: 
        Picasso.with(act) 
          .load(selectedPhotoUri) 
          .transform(new SwirlFilterTransformation(act, 0.5f, 1.0f, new PointF(0.5f, 0.5f))) 
          .into(photo); 
        break; 
       case 8: 
        Picasso.with(act) 
          .load(selectedPhotoUri) 
          .transform(new BrightnessFilterTransformation(act, 0.5f)) 
          .into(photo); 
        break; 
       case 9: 
        Picasso.with(act) 
          .load(selectedPhotoUri) 
          .transform(new VignetteFilterTransformation(act, new PointF(0.5f, 0.5f), 
            new float[]{0.0f, 0.0f, 0.0f}, 0f, 0.75f)) 
          .into(photo); 
        break; 
       default: 
        photo.setImageDrawable(drawable); 
        break; 
      } 
     } 

     @Override 
     public void onLongClick(View view, int position) { 

     } 
    })); 
} 
+0

あなたは何かを選択/クリックしていることを知るためにclickListenerなどがありますか? – Rahul

+0

はい、カスタマイズされたリスナーを使用しました。そのコードを追加しますか? – musica

+0

あなたは 'public enum Type'から 'public class Type'への変更が可能ですか? – Rahul

答えて

22

ちょうどあなたのために動作しますbindView

holder.itemView.setBackgroundColor(Color.parseColor("#000000")); 

に線の下にこれを追加します。あなたが選択した項目を強調表示したい場合は

だけ行うよう

セット以下のことグローバル

int selectedPosition=-1; 

onBindViewHolder-

内部
public void onBindViewHolder(FiltersAdapter.ViewHolder holder, int position) { 
if(selectedPosition==position) 
    holder.itemView.setBackgroundColor(Color.parseColor("#000000")); 
else 
    holder.itemView.setBackgroundColor(Color.parseColor("#ffffff")); 

holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       selectedPosition=position; 
       notifyDataSetChanged(); 

      } 
     }); 
} 
+0

dint work ...それはリサイクルビュー全体にバックグラウンドを追加しました – musica

+0

リサイクルビューのアイテムではなくリサイクルビューだけにバックグラウンドが追加されます。あなたの商品にはマージンが含まれていないので、リサイクルの全体像を記入し、商品レイアウトにマージンを追加します。 –

+0

でも、前の選択した項目を選択解除し、並行項目のみをハイライトしたいとします...あなたの答えはそうではありません...項目に背景だけを設定します – musica

0

更新最初のフラグのクラスへのご列挙

public class Type { 
    public int type; // 0-Original,1-Grayscale,2-Sepia.... same as enum 
    public int selected; 
} 

今アダプタで

@Override 
public void onBindViewHolder(FiltersAdapter.ViewHolder holder, int position) { 
    int typeOfItem = mDataSet.get(position).type 
    switch (mDataSet.get(position)) { 
     case 0: 
      holder.image.setImageResource(R.drawable.no_filter); 
      break; 
     case 1: 
      Picasso.with(mContext) 
        .load(R.drawable.no_filter) 
        .transform(new GrayscaleTransformation()) 
        .into(holder.image); 
      break; 
     case 2: 
      Picasso.with(mContext) 
        .load(R.drawable.no_filter) 
        .transform(new SepiaFilterTransformation(mContext)) 
        .into(holder.image); 
      break; 
     case 3: 
      Picasso.with(mContext) 
        .load(R.drawable.no_filter) 
        .transform(new ContrastFilterTransformation(mContext, 2.0f)) 
        .into(holder.image); 
      break; 
     case 4: 
      Picasso.with(mContext) 
        .load(R.drawable.no_filter) 
        .transform(new InvertFilterTransformation(mContext)) 
        .into(holder.image); 
      break; 
     case 5: 
      Picasso.with(mContext) 
        .load(R.drawable.no_filter) 
        .transform(new PixelationFilterTransformation(mContext, 20)) 
        .into(holder.image); 
      break; 
     case 6: 
      Picasso.with(mContext) 
        .load(R.drawable.no_filter) 
        .transform(new SketchFilterTransformation(mContext)) 
        .into(holder.image); 
      break; 
     case 7: 
      Picasso.with(mContext) 
        .load(R.drawable.no_filter) 
        .transform(new SwirlFilterTransformation(mContext, 0.5f, 1.0f, new PointF(0.5f, 0.5f))) 
        .into(holder.image); 
      break; 
     case 8: 
      Picasso.with(mContext) 
        .load(R.drawable.no_filter) 
        .transform(new BrightnessFilterTransformation(mContext, 0.5f)) 
        .into(holder.image); 
      break; 
     case 9: 
      Picasso.with(mContext) 
        .load(R.drawable.no_filter) 
        .transform(new VignetteFilterTransformation(mContext, new PointF(0.5f, 0.5f), 
          new float[]{0.0f, 0.0f, 0.0f}, 0f, 0.75f)) 
        .into(holder.image); 
      break; 
     default: 
      holder.image.setImageResource(R.drawable.no_filter); 
      break; 
    } 
    holder.title.setText(mDataSet.get(position).name()); 
    if(mDataSet.get(position).selected == 0){ 
     holder.title.setTypeface(null, Typeface.BOLD); 
    } else { 
     holder.title.setTypeface(null,Typeface.NORMAL); 
    } 
} 

ないでおき、その後

2

用背景セレクタアダプタのnotifydatasetChanged()を呼び出して、あなたのリストを更新し、設定をクリックするか、選択することアンドロイドで:のレイアウトXMLで背景プロパティrecyclerview項目

background_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="false" android:state_selected="true"> 
     <shape> 
      <solid android:color="@color/lightPrimaryColor" /> 
     </shape> 
    </item> 

    <item android:state_selected="false"> 
     <shape> 
      <solid android:color="@android:color/transparent" /> 
     </shape> 
    </item> 
</selector> 

recyclerview_item.xml(background_selectorがアンドロイドに設定されている:backgroundプロパティ)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/background_selector" 
    android:orientation="vertical" 
    android:paddingBottom="8dp" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:paddingTop="8dp"> 

そして、あなたはビュー機能を

ビューを選択したとして、あなたがそれを設定することができますクリックイベントを取得する場所.setSelected(true)

選択したアイテムの位置を保存してアイテムの選択を解除/選択するロジックを実装する必要があります

関連する問題