Android 工作室 OnTouchListener for RecyclerView 项目,更改项目颜色



当您查看我的适配器时,您可以看到一个OnTouchListener。您可以看到我想在触摸时更改元素的颜色。但是在有两行以上之后,我可以看到当我只单击一行时,我更改了所有元素的颜色。有没有办法只说 #change 点击的项目的颜色#?

public class SettingsAdapter extends RecyclerView.Adapter<SettingsAdapter.MySettingHolder> {
    private List<Settings> settingList;
    private Context context;
    public class MySettingHolder extends RecyclerView.ViewHolder {
        public int type;
        public ImageView settingImage;
        public TextView settingTitle, settingSubtitle;
        public MySettingHolder(View view) {
            super(view);
            settingImage = (ImageView) view.findViewById(R.id.settingImage);
            settingTitle = (TextView) view.findViewById(R.id.settingTitle);
            settingSubtitle = (TextView) view.findViewById(R.id.settingSubtitle);
        }
    }
    public SettingsAdapter(Context context) {
        this.context = context;
    }
    public SettingsAdapter(List<Settings> settingList) {
        this.settingList = settingList;
    }
    @Override
    public MySettingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.settings_list_row, parent, false);
        return new MySettingHolder(itemView);
    }
    @Override
    public void onBindViewHolder(MySettingHolder holder, int position) {
        // Setting for one entry
        final Settings setting = settingList.get(position);
        //RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        holder.settingImage.setImageResource(setting.getSettingImageUrl());
        // If the settingSubtitle is empty it should be not visible and just the settingTitle
        if (setting.getSettingSubtitle().equals("")) {
            //params.setMargins(0, 18, 0, 18);
            //holder.settingTitle.setLayoutParams(params);
            holder.settingTitle.setText(setting.getSettingTitle());
            holder.settingSubtitle.setVisibility(View.GONE);
        } else {
            //params.setMargins(0, 18, 0, 18);
            //holder.settingTitle.setLayoutParams(params);
            //params.setMargins(0, 0, 0, 18);
            //holder.settingSubtitle.setLayoutParams(params);
            holder.settingTitle.setText(setting.getSettingTitle());
            holder.settingSubtitle.setText(setting.getSettingSubtitle());
        }
        // Get setting holder type
        holder.type = setting.getType();
        // OnTouchListener for holder/vector color change
        holder.itemView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // Define setting holder
                MySettingHolder holder = (MySettingHolder) (v.getTag());
                // ImageView for changing color
                ImageView imageView = (ImageView) v.findViewById(R.id.settingImage);
                // Detect if user touch or not
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    // Change ImageView color to primary color
                    DrawableCompat.setTint(imageView.getDrawable(), ContextCompat.getColor(v.getContext(), R.color.colorPrimary));
                } else if (event.getAction() == android.view.MotionEvent.ACTION_UP) {
                    // Change ImageView color to primary color
                    DrawableCompat.setTint(imageView.getDrawable(), ContextCompat.getColor(v.getContext(), R.color.iconGray));
                }
                return false;
            }
        });
        // OnClickListener for holder
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                // Define setting holder
                MySettingHolder holder = (MySettingHolder) (v.getTag());
                // Define switch for line
                switch (holder.type) {
                    // Case 1 = Logout
                    case 1:
                        // OnCLickListener for an event
                        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                switch (which) {
                                    // Case user types Yes
                                    case DialogInterface.BUTTON_POSITIVE:
                                        // Deleting shared preferences for login activity
                                        SharedPreferences loginPreferences = v.getRootView().getContext().getSharedPreferences("loginPrefs", Context.MODE_PRIVATE);
                                        SharedPreferences.Editor editor = loginPreferences.edit();
                                        editor.clear();
                                        editor.commit();
                                        // Start new acitivity for login
                                        v.getContext().startActivity(new Intent(v.getContext(), LoginActivity.class));
                                        // Exit activity
                                        ((Activity)v.getContext()).finish();
                                        // Exit case button positive/yes
                                        break;
                                    case DialogInterface.BUTTON_NEGATIVE:
                                        // Dismiss dialog
                                        dialog.dismiss();
                                        // Exit case button negative/no
                                        break;
                                }
                            }
                        };
                        // AlertDialog for logout check
                        AlertDialog.Builder builder = new AlertDialog.Builder(v.getRootView().getContext());
                        builder.setMessage("Möchtest du dich wirklich abmelden?")
                                .setPositiveButton("Ja", dialogClickListener)
                                .setNegativeButton("Nein", dialogClickListener)
                                .show();
                        // Exit switch
                        break;
                    case 2:
                        // do other stuff
                        break;
                    default:
                        break;
                }
            }
        });
        holder.itemView.setTag(holder);
    }
    @Override
    public int getItemCount() {
        return settingList.size();
    }
}

我的工作解决方案是保持触发 onTouch 事件的项的位置 holder.getAdapterPosition() 然后,当使用任何notifyDataSetChange()方法更新回收器时,您可以强制仅重绘与您的 onTouch 位置匹配的位置。

另一个更有效的方法是仅更新触发 onTouch 事件的位置:

notifyItemChanged(positionItemTouched);

最新更新