简体   繁体   English

ListView项目在滚动上的位置更改

[英]ListView Item Position Change on Scroll

When I scroll down/up so quickly, the position changes so fast that it messes up the item for the position, causing the texts to change instead of what it should be. 当我如此快速地向下/向上滚动时,位置变化太快,以至于弄乱了该位置的项目,导致文本发生变化,而不是应有的变化。 I've been searched around fixes but can't seem to figure where it went wrong. 我已经被搜索过一些修复程序,但是似乎无法弄清楚哪里出了问题。 Below is my Custom ArrayAdapter Code 以下是我的自定义ArrayAdapter代码

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.TextView;

import java.util.ArrayList;

import aungkyawpaing.ngapyinkeyboard.Models.CustomKey;
import aungkyawpaing.ngapyinkeyboard.R;
import butterknife.ButterKnife;
import butterknife.InjectView;

/**
 * Created by Vincent on 16-Apr-15.
 */
public class CustomKeyAdapter extends ArrayAdapter<CustomKey> {

    private int size;
    ArrayList<CustomKey> datas = new ArrayList<>();

    public CustomKeyAdapter(Context context, ArrayList<CustomKey> list) {
        super(context, R.layout.listitem_customkey, list);
        size = list.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;

        if (convertView != null) {
            viewHolder = (ViewHolder) convertView.getTag();
        } else {
            LayoutInflater layoutInflater =
                    (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.listitem_customkey, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }
        CustomKey key = getItem(position);
        datas.add(position, key);

        viewHolder.txt_number.setText("Key #" + (position + 1) + " : ");
        viewHolder.value_field.setText(key.getOutput());
        viewHolder.value_field.addTextChangedListener(new MyTextWatcher(position));

        return convertView;
    }

    private class MyTextWatcher implements TextWatcher {

        private int position;

        public MyTextWatcher(int position) {
            this.position = position;
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            CustomKey key = getItem(position);
            key.setOutput(editable.toString());
            datas.add(position, key);
        }
    }

    static class ViewHolder {
        @InjectView(R.id.custom_key_number) TextView txt_number;
        @InjectView(R.id.custom_key_value) EditText value_field;

        public ViewHolder(View view) {
            ButterKnife.inject(this, view);
        }
    }

    public ArrayList<CustomKey> getValues() {
        return datas;
    }
}

EDIT: TextView is fine, it's just the texts in EditText that keep changing 编辑:TextView很好,只是EditText中的文本不断变化

Before adding the TextWatcher to the EditText remove the existing TextWatcher of the EditText . 加上之前TextWatcherEditText删除现有TextWatcher中的EditText
In the TextWatcher TextWatcher

 static class ViewHolder {
        @InjectView(R.id.custom_key_number) TextView txt_number;
        @InjectView(R.id.custom_key_value) EditText value_field;
        MyTextWatcher myWatcher;
        public ViewHolder(View view) {
            ButterKnife.inject(this, view);
        }
    }

Now remove the existing TextWatcher of the EditText ,initialize the TextWatcher of the view holder in the getView() method and add the TextWatcher to the EditText 现在删除现有TextWatcher所述的EditText ,初始化TextWatcher视图支架在getView()方法和添加TextWatcher到的EditText

 public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;

        if (convertView != null) {
            viewHolder = (ViewHolder) convertView.getTag();
        } else {
            LayoutInflater layoutInflater =
                    (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.listitem_customkey, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }
        CustomKey key = getItem(position);
        datas.add(position, key);

        viewHolder.txt_number.setText("Key #" + (position + 1) + " : ");
        viewHolder.value_field.setText(key.getOutput());
        //Remove the myWatcher
        viewHolder.value_field.emoveTextChangedListener(myWatcher);
        viewHolder.myWatcher=new MyTextWatcher(position);
        //add the myWatcher
        viewHolder.value_field.addTextChangedListener(myWatcher);

        return convertView;
    }

I have solved the issue. 我已经解决了这个问题。 I will Seems like in "onTextChanged", the key is referencing to the item in the view. 我似乎就像在“ onTextChanged”中一样,关键是引用视图中的项目。 and therefore setOutput changes that key output. 因此setOutput更改该键输出。 Fixed the issue with following code 使用以下代码修复了该问题

public void afterTextChanged(Editable editable) {
    CustomKey key = getItem(position);
    datas.add(position,  new CustomKey(key.getCode(), editable.toString()));
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM