我在Android中使用listview
和textview
编码可滚动的edittext
。因为滚动时存在问题,新数据会丢失,我会更新ArrayList
中的TextChangedListener
,如下所示:
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()
方法I中设置此类数据
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:现在我发现位置&gt; 7的所有行都在开头已经convertView!= null,这意味着他们跳过了if(convertView == null)代码。但为什么呢?
答案 0 :(得分:0)
假设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);
}
}
答案 1 :(得分:0)
对于那些有同样问题的人:
我解决了从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