【问题标题】:Android ViewHolder pattern gets the wrong viewholder objectAndroid ViewHolder 模式获取错误的 viewholder 对象
【发布时间】:2017-01-31 13:11:04
【问题描述】:

我有一个带有 ViewHolder 模式的 ListView。屏幕上有 10 行的空间。当我向下滚动 ListView 时,android 使用 position = 12 调用 getView 但 convertView.getTag() 返回一个 position = 0 的 ViewHolder。

这是我的代码:

public View getView(int position, View convertView, ViewGroup parent) {
        final int pos = position;
        ViewHolder holder;
        TextView positionText;
        TextView nameText;
        //TextView resultText;
        //TextView unitText;
        //TextView remarkText;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.row_maintenancetask, null);
            maxPosition = position;

            EditText remarkText;
            EditText resultText;

            remarkText = (EditText) convertView.findViewById(R.id.remarktext);
            resultText = (EditText) convertView.findViewById(R.id.editTextResult);

            holder = new ViewHolder();
            holder.position = position;
            holder.edtRemark = remarkText;
            holder.edtResultText = resultText;

            holder.edtRemark.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start,
                        int before, int count) {
                    //setting data to array, when changed
                    m_maintenancetasks.get(pos).setMaintenanceTaskRemark(s.toString());
                }

                @Override
                public void beforeTextChanged(CharSequence s, int start,
                        int count, int after) {

                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            }); 

            holder.edtResultText.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start,
                        int before, int count) {
                    //setting data to array, when changed
                    m_maintenancetasks.get(pos).setMaintenanceTaskResult(s.toString());
                }

                @Override
                public void beforeTextChanged(CharSequence s, int start,
                        int count, int after) {

                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });
        }
        else
        {
            holder = (ViewHolder)convertView.getTag();
        }

        positionText = (TextView) convertView.findViewById(R.id.positiontext);
        nameText = (TextView) convertView.findViewById(R.id.nametext);
        //resultText = (TextView) convertView.findViewById(R.id.resulttext);
        //unitText = (TextView) convertView.findViewById(R.id.maintenanceunittext);



        holder.edtRemark.setOnTouchListener(onListTouch);
        holder.edtRemark.setText(m_maintenancetasks.get(position).getMaintenanceTaskRemark());



        holder.edtResultText.setOnTouchListener(onListTouch);
        holder.edtResultText.setText(m_maintenancetasks.get(position).getMaintenanceTaskResult());


        convertView.setOnTouchListener(onListTouch);
        convertView.setTag(holder);

        return convertView;
    }

    private class ViewHolder {
        Integer position;
        EditText edtRemark;
        EditText edtResultText;
    }

【问题讨论】:

标签: android


【解决方案1】:

这是预期的行为。 Android 正在回收视图,因此如果您继续滚动,您将获得位置为 1 的 Viewholder。 您不应该将位置存储在 Viewholder 中。

【讨论】:

    猜你喜欢
    • 2014-01-22
    • 2015-07-20
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    相关资源
    最近更新 更多