[英]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
. 加上之前
TextWatcher
到EditText
删除现有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.