【问题标题】:Recycler View Scroll changing item values回收者视图滚动更改项目值
【发布时间】:2018-03-09 16:18:53
【问题描述】:

当我向下滚动然后返回顶部时,我的项目已更改为列表中的其他项目,如果我再次滚动,则再次更改项目。

编辑文本值消失,微调器值自动更改。

这是我的MyRecyclerViewAdapter 课程。

class MyRecyclerViewAdapter extends
        RecyclerView.Adapter<MyRecyclerViewAdapter.CustomViewHolder> {
    private List<UpdateAtt> feedItemList;
    private Context mContext;
    private String[] mColorNames = new String[]{"Absent", "Half Day", "Leave", "Present", "Suspend"};

    public MyRecyclerViewAdapter(Context context, List<UpdateAtt> feedItemList) {
        this.feedItemList = feedItemList;
        this.mContext = context;
    }

    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, final int i) {
        //View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_attendance, null);
        View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_attendance, parent, false);
        CustomViewHolder viewHolder = new CustomViewHolder(mView);
        return viewHolder;
    }

    class CustomViewHolder extends RecyclerView.ViewHolder {

        private final TextView tvName;
        private final TextView tvSid;
        private final EditText etRemark;
        private final Spinner tvSpinner;

        public CustomViewHolder(View view) {
            super(view);
            this.tvName = (TextView) view.findViewById(R.id.tv_Name);
            this.tvSid = (TextView) view.findViewById(R.id.tv_sid);
            this.etRemark = (EditText) view.findViewById(R.id.et_remarks);
            this.tvSpinner = (Spinner) view.findViewById(R.id.spinner1);
            ArrayAdapter<String> startColorsAdapter = new ArrayAdapter<String>(mContext, R.layout.simple_list_item, mColorNames);
            tvSpinner.setAdapter(startColorsAdapter);
        }
    }

    @Override
    public void onBindViewHolder(final CustomViewHolder customViewHolder, final int position) {
        customViewHolder.tvName.setText(Html.fromHtml(feedItemList.get(position).getSName()));
        customViewHolder.tvSid.setText(Html.fromHtml(feedItemList.get(position).getSid()));
        customViewHolder.etRemark.setText(Html.fromHtml(feedItemList.get(position).getRemark()));

        //Setting text view title
    }

    @Override
    public int getItemCount() {
        return (null != feedItemList ? feedItemList.size() : 0);
    }
}

【问题讨论】:

  • 将选定的微调器项目保持在某处并使用该值将其正确设置。

标签: android scroll android-recyclerview android-spinner textfield


【解决方案1】:

onBindViewHolder() 中使用holder.getAdapterPosition(),而不是onBindViewHolder() 返回的位置。 喜欢,

customViewHolder.tvName.setText(Html.fromHtml(feedItemList.get(customViewHolder.getAdapterPosition()).getSName()));

编辑: 设置:customViewHolder.setIsRecyclable(false);

【讨论】:

  • 请在使用getAdapterPosition()的地方写一行代码。
  • 我已经在我的回答中加入了你的一行代码。请通过它。
  • 我想提一下,edittext 字段是可编辑的,当我输入一些文本或在下拉菜单或微调器中设置值时,然后滚动它会更改值或消失 edittext 值。
【解决方案2】:

我想建议您更改适配器类,如下所示。它应该工作。

class MyRecyclerViewAdapter extends
        RecyclerView.Adapter<MyRecyclerViewAdapter.CustomViewHolder> {
    private List<UpdateAtt> feedItemList;
    private Context mContext;
    private String[] mColorNames = new String[]{"Absent", "Half Day", "Leave", "Present", "Suspend"};

    public MyRecyclerViewAdapter(Context context, List<UpdateAtt> feedItemList) {
        this.feedItemList = feedItemList;
        this.mContext = context;
        ArrayAdapter<String> startColorsAdapter = new ArrayAdapter<String>(mContext, R.layout.simple_list_item, mColorNames);
    }

    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, final int i) {
        //View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_attendance, null);
        View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_attendance, parent, false);
        CustomViewHolder viewHolder = new CustomViewHolder(mView);
        return viewHolder;
    }

    class CustomViewHolder extends RecyclerView.ViewHolder {

        private final TextView tvName;
        private final TextView tvSid;
        private final EditText etRemark;
        private final Spinner tvSpinner;
        ArrayAdapter<String> startColorsAdapter;

        public CustomViewHolder(View view) {
            super(view);
            this.tvName = (TextView) view.findViewById(R.id.tv_Name);
            this.tvSid = (TextView) view.findViewById(R.id.tv_sid);
            this.etRemark = (EditText) view.findViewById(R.id.et_remarks);
            this.tvSpinner = (Spinner) view.findViewById(R.id.spinner1);
            startColorsAdapter = new ArrayAdapter<String>(mContext, R.layout.simple_list_item, mColorNames);
        }

        public void bindView(int position) {
            tvName.setText(Html.fromHtml(feedItemList.get(position).getSName()));
            tvSid.setText(Html.fromHtml(feedItemList.get(position).getSid()));
            etRemark.setText(Html.fromHtml(feedItemList.get(position).getRemark()));
            tvSpinner.setAdapter(startColorsAdapter);
        }
    }

    @Override
    public void onBindViewHolder(final CustomViewHolder customViewHolder, final int position) {
        customViewHolder.bindView(position);
    }

    @Override
    public int getItemCount() {
        return (null != feedItemList ? feedItemList.size() : 0);
    }
}

为了在每一行中保存微调器项的状态,您需要声明一个数组来保存这些状态,并在bindView 函数中相应地填充微调器中的确切项。

【讨论】:

  • customViewHolder.bindView(items.get(position));这行代码中的项目是什么
  • 对不起,只有position 应该通过。请检查更新后的代码。
  • 你现在遇到什么问题?
  • 当我将一些文本放入edittext并滚动recyclerview时,文本字段文本消失了
  • 是的,当然会消失。将文本放入EditText 时,需要将文本保存在数组中。然后在您的bindView 函数中,您需要从数组中获取文本并将其设置到您的EditText 中。在EditText 中添加TextWatcher 以获取EditText 中的输入值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
相关资源
最近更新 更多