Recycler View滚动更改项目值

时间:2018-03-09 16:18:53

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

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

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

这是我的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);
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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函数内相应地填充微调器中的确切项。