【问题标题】:RecyclerView change selected item background and text colorRecyclerView 更改所选项目背景和文本颜色
【发布时间】:2017-04-04 07:34:12
【问题描述】:

我正在使用RecyclerView. 我尝试使用selector.xml 文件更改项目单击中的背景颜色。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/trains_vagon_selected_departure" android:state_pressed="true" />
    <item android:drawable="@drawable/trains_vagon_selected_departure" android:state_focused="true" />
    <item android:drawable="@drawable/trains_vagon_selected_white" />
</selector>

适配器代码:

public class TrainsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public ArrayList<Train> trains;
    public Context context;
    private LayoutInflater inflater;
    private String statusString = "";

    public TrainsAdapter(Context context, ArrayList<Train> trains, String statusString) {
        this.context = context;
        this.trains = trains;
        inflater = LayoutInflater.from(context);
        this.statusString = statusString;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.trains_adapter_item, parent, false);
        GenericViewHolder holder = new GenericViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        if (holder instanceof GenericViewHolder) {
            final GenericViewHolder genericViewHolder = (GenericViewHolder) holder;
            genericViewHolder.vagoncontainer.removeAllViews();
            Train train = trains.get(position);
            if (statusString.equals("departure"))
                genericViewHolder.statusImageView.setImageResource(R.mipmap.departure_icon);
            else
                genericViewHolder.statusImageView.setImageResource(R.mipmap.return_icon);
            ArrayList<Vagons> vagons = train.getVagons();
            for (int i = 0; i < vagons.size(); i++) {
                if (vagons.get(i).getEnable().equals("1")) {
                    LayoutInflater layoutInflater = LayoutInflater.from(context);
                    final LinearLayout vagonView = (LinearLayout) layoutInflater.inflate(R.layout.trains_vagon_child, null);
                    genericViewHolder.vagoncontainer.setBackgroundColor(Color.WHITE);
                    RelativeLayout relativeLayout = (RelativeLayout) vagonView.findViewById(R.id.selected_layout);

                    if (statusString.equals("departure"))
                        relativeLayout.setBackgroundResource(R.drawable.recyclerview_selected_departure);
                    else
                        relativeLayout.setBackgroundResource(R.drawable.recyclerview_selected_returned);

                    TextView vagonClassName = (TextView) vagonView.findViewById(R.id.vagon_class_name);
                    TextView vagonClassPrice = (TextView) vagonView.findViewById(R.id.vagon_class_price);
                    vagonClassName.setText(vagons.get(i).getName());
                    vagonClassPrice.setText(vagons.get(i).getAmount());

                    genericViewHolder.vagoncontainer.addView(vagonView);
                }
            }

            genericViewHolder.trainTime.setText(train.getDeparture());
        }
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

    public Train getItem(int position) {
        return trains.get(position);
    }

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

    public class GenericViewHolder extends RecyclerView.ViewHolder {
        public TextView trainTime;
        public LinearLayout vagoncontainer;
        private ImageView statusImageView;

        public GenericViewHolder(View view) {
            super(view);

            trainTime = (TextView) view.findViewById(R.id.train_time);
            statusImageView = (ImageView) view.findViewById(R.id.departure_next_img);

            vagoncontainer = (LinearLayout) view.findViewById(R.id.vagon_container);
        }
    }
}

我有两个问题。

1) 当我在RecyclerView 中运行第一个元素时,也会自动选择。为什么?我该如何解决?

2) 是否可以更改选择器xml 文件中的文本颜色? 我知道如何按位置更改简单的 recyclerView 的背景和文本颜色,但是目前按位置的每个元素都有一些数组,我将其添加到我的位置,我尝试更改子视图的背景和文本颜色(请参阅我的代码。我的意思是vagonView 视图)

谢谢大家。

【问题讨论】:

    标签: android android-recyclerview android-xml android-relativelayout


    【解决方案1】:

    它可能是由于state_focus="true"而在您运行应用程序时被选中。

    【讨论】:

    • 你是对的,但是当我写默认 false 时,焦点不会一直工作@Hasmukh kachhatiya
    • 那你得试试state_pressed="true"
    • 我试过了,第一次自动选择了第一个元素@Hasmukh kachhatiya
    • 你可以继续聊天吗? @Hasmukh kachhatiya
    【解决方案2】:
    1. 如何知道第一个元素被选中?
    2. 只需使用一些颜色状态列表设置android:textColor

    【讨论】:

    • 1) 当我运行第一个元素时,已经选择了 2) 你是什么意思?你能解释更多吗? @Cesario
    • for 2.假设你有一个TextView,将textColor设置为一些颜色状态列表(选择器xml),但你需要为文本颜色创建另一个xml
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多