Search code examples
androidandroid-recyclerviewcolorfilter

Android - Setting colofilter on recyclerview items not getting reflected


I want to dynamically set saturation colorfilter for certain items in recyclerview. But eventhough i am not getting any error, it is not getting reflected on screen. This is my code:

Adapter class:

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.GridViewHolder> {

ArrayList<HashMap<String, String>> items;
Context context;

public DashBoardRecyclerViewAdapter(Context context, ArrayList<HashMap<String, String>> items) {
    this.items = items;
    this.context = context;
}

@Override
public GridViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_list_items, viewGroup, false);
    return new GridViewHolder(v, context);
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@Override
public void onBindViewHolder(GridViewHolder gridViewHolder, int i) {
    Paint paint = new Paint();
    ColorMatrix colorMatrix = new ColorMatrix();
    colorMatrix.setSaturation(0f);
    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);
    for (Map.Entry<String, String> mapEntry : items.get(i).entrySet()) {
        String key = mapEntry.getKey();
        String value = mapEntry.getValue();
        gridViewHolder.keyTxtView.setText(key);
        gridViewHolder.valueTxtView.setText(value);
        if (value == null || value.equals("")) {
            paint.setColorFilter(filter);
            gridViewHolder.getContainerView().setLayerPaint(paint);
        }
    }

}

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

public static class GridViewHolder extends RecyclerView.ViewHolder {
    TextView keyTxtView, valueTxtView;
    View containerView;

    GridViewHolder(View v, Context context) {
        super(v);
        containerView = v.findViewById(R.id.grid_item_container);
        keyTxtView = (TextView) v.findViewById(R.id.keyTxtView);
        valueTxtView = (TextView) v.findViewById(R.id.valueTxtView);
    }

    public View getContainerView() {
        return containerView;
    }

}

}

XML Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/grid_item_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:background="#f1f1f1"
    android:padding="@dimen/activity_horizontal_margin">

<!-- TextViews -->

</LinearLayout>

What am i missing? I even tried PorterDuffColorFilter, but still not working.


Solution

  • Finally got it working. Since colormatrix colorfilter did not help, i used PorterDuffColorFilter to set color filter for the linearlayout and its child imageview as follows:

    @Override
    public void onBindViewHolder(GridViewHolder gridViewHolder, int i) {
        PorterDuffColorFilter greyFilter = new PorterDuffColorFilter(0xffc6c9ce, PorterDuff.Mode.SRC_ATOP);
        PorterDuffColorFilter greyFilterImg = new PorterDuffColorFilter(0xFF6E6E6E, PorterDuff.Mode.SRC_ATOP);
        for (Map.Entry<String, String> mapEntry : items.get(i).entrySet()) {
            String key = mapEntry.getKey();
            String value = mapEntry.getValue();
            gridViewHolder.keyTxtView.setText(key);
            gridViewHolder.valueTxtView.setText(value);
            if (value == null || value.equals("")) {
                gridViewHolder.my_imgview.getDrawable().mutate().setColorFilter(greyFilterImg);
                gridViewHolder.getContainerView().getBackground().setColorFilter(greyFilter);
            }
        }
    
    }