[英]Why does my the listview position items wrongly?
我正在用每行textview
和edittext
在android中編碼一個可滾動的listview
。 因為滾動時存在問題,所以新數據丟失了,我在TextChangedListener
更新了ArrayList
,如下所示:
TextWatcher txtwatch = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() > 0) {
if (!scrolling) {
InhalteArr.set(position, s.toString());
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
我的問題是,此方法有效,但僅適用於前七個行。 以下各行顯示了正確的信息,但沒有在ArrayList
的正確位置設置更新的數據。
我不明白為什么前七行正在做我想要的,而其余的似乎開始重新設置更新的數據從零開始遞增計數,而不是從八開始。
這非常令人毛骨悚然,因為所有行以及最后一行似乎都從ArrayList獲取正確的數據,但是最后一個視圖行將數據設置在ArrayList中的錯誤位置。
在getView()
方法中,我像這樣設置數據
viewHolder.Inhalt.setText(InhalteArr.get(position).toString());
but that works.
有人知道嗎? 謝謝!
編輯:這是我的適配器:
public class SyAdapter extends ArrayAdapter<ArrayList> {
Typeface bahn = Typeface.createFromAsset(getContext().getAssets(), "fonts/bahnschrift.ttf");
Typeface ih = Typeface.createFromAsset(getContext().getAssets(), "fonts/corbel.ttf");
private static class ViewHolder {
TextView Merkmal;
TextView Inhalt;
}
ArrayList MerkmaleArr;
ArrayList InhalteArr;
public SyAdapter (Context context, ArrayList Merkmale, ArrayList Inhalte) {
super(context, R.layout.listanzeige, R.id.MerkmalT, Merkmale);
this.MerkmaleArr = Merkmale;
this.InhalteArr = Inhalte;
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.listanzeige, parent, false);
viewHolder.Merkmal = (TextView) convertView.findViewById(R.id.MerkmalT);
viewHolder.Merkmal.setTypeface(bahn);
viewHolder.Inhalt = (TextView) convertView.findViewById(R.id.InhaltT);
viewHolder.Inhalt.setTypeface(ih);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
System.out.println("Aktuelle Position: " + position);
viewHolder.Inhalt.setText(InhalteArr.get(position).toString());
viewHolder.Merkmal.setText(MerkmaleArr.get(position).toString());
return convertView;
}}
EDIT2:現在我發現位置> 7的所有行在開始時都已經convertView!= null,這意味着,它們跳過了if(convertView == null)代碼。 但為什么?
假設InhalteArr和MerkmaleArr的大小相同
將此方法添加到您的適配器類
@Override
public int getCount() {
return InhalteArr.size();
}
適配器類細化示例:
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
convertView = layoutInflater.inflate(R.layout.listanzeige, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.Inhalt.setText(InhalteArr.get(position).toString());
viewHolder.Merkmal.setText(MerkmaleArr.get(position).toString());
return convertView;
}
private class ViewHolder {
final EditText Inhalt;
final TextView Merkmal;
public ViewHolder(View v) {
Inhalt = v.findViewById(R.id.InhaltT);
Merkmal = v.findViewById(R.id.MerkmalT);
}
}
對於那些有相同問題的人:我解決了在if(convertview == null)
設置標簽的問題,起初我試圖將標簽設置為該if
方法,但是這不適用於所有行。
為了將edittext's
標簽放入onTextChangeListener
我在stackoverflow上找到了一些不錯的代碼:
View focView = activity.getCurrentFocus();
if (focView != null) {
EditText edit = (EditText) focView.findViewById(R.id.tvinhalt);
if (edit != null && edit.getText().toString().equals(s.toString())) {
int positionof = Integer.parseInt(edit.getTag().toString());
System.out.println("Tag= " + positionof);
YouArray.set(positionof, s.toString());
}
希望有了這個答案,您不必花我太多的時間來理解,標記必須在if
函數之外設置:D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.