Наилучшая производительность для настройки цвета TextView программно - PullRequest
0 голосов
/ 18 мая 2018

У меня есть RecyclerView, отображающий Cardviews.Каждый CardView имеет пять (5) текстовых представлений.В зависимости от типа каждой карты я меняю цвет текста на красный, синий или зеленый (по умолчанию).Все это происходит в моем onBindViewHolder, поэтому производительность очень важна для моего пользовательского опыта.Вот что я делаю прямо сейчас в моем onBindViewHolder.

    //set text color per card type
        int int_textColor;
        String type = arrayListFiltered.get(position).getType().toLowerCase();
        String s_rating_type;
        if (!FormatFactory.isStringEmpty(type)){
            if (type.contains("featured")){
                int_textColor = R.color.red;
            }else if (type.contains("connector")){
                int_textColor = R.color.blue;
            }else{
                int_textColor = R.color.green;
            }
        }else{
            int_textColor =R.color.green;
        }
        setTextColor(recyclerViewHolder.tv_rating_type, int_textColor);
        setTextColor(recyclerViewHolder.tv_length, int_textColor);
        setTextColor(recyclerViewHolder.tv_name, int_textColor);
        setTextColor(recyclerViewHolder.tv_location, int_textColor);
        setTextColor(recyclerViewHolder.tv_summary, int_textColor);

, а вот мой метод setTextColor

private void setTextColor(TextView tv, int color){
    tv.setTextColor(ContextCompat.getColor(tv.getContext(), color));
}

Существует множество способов изменить цвет текста, и я не смог найтилюбое обсуждение относительно метода, который обеспечивает лучшую производительность.Хотя этот код работает просто отлично, я бы переписал его для небольшого прироста производительности.

1 Ответ

0 голосов
/ 18 мая 2018

Я думаю, вы можете переопределить метод getItemViewType адаптера, и раздувать другой макет другим цветом. Позвольте адаптеру обрабатывать изменение цвета, а не менять его динамически.

например:

public class MyAdapter extends RecyclerView.Adapter<T> {

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        int rid;
        switch (viewType) {
            case 0: // for featured type
                rid= R.layout.red;
                break;
            case 1 : // for connector type
                rid= R.layout.blue;
                break;
            default:
                rid= R.layout.green;
                break;
        }
        View v= LayoutInflater.from(parent.getContext()).inflate(id, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public int getItemViewType(int position) {
        return arrayListFiltered.get(position).getType(); // need int type
    }

    ...
}
...