2016-08-25 56 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

是的,我使用了一個定製的Listener ...你想讓我添加這個代碼嗎? – 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工作...它將背景添加到整個recyclerview – musica

+0

它只會爲您添加背景recycleView的物品不是recycleView。而且您的商品不包含保證金,因此它會填充您的整個回收視圖,爲您的商品佈局添加保證金。 –

+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); 
    } 
} 

不是每一次點擊或選擇更新列表,然後調用適配器notifydatasetChanged()

2

使用背景選擇,並設置在安卓背景財產的佈局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設置在安卓背景屬性)

<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)

您將不得不實施邏輯,以便當您想要通過存儲所選項目的位置取消選擇/選擇項目時

相關問題