【问题标题】:Why does my the listview position items wrongly?为什么我的列表视图位置错误?
【发布时间】:2018-06-11 14:21:24
【问题描述】:

我在 android 中编写了一个可滚动的 listview,每行都有 textviewedittext。因为滚动时会出现问题,新数据会丢失,所以我在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) 代码。但为什么呢?

【问题讨论】:

  • 请发布您的适配器的代码。
  • 覆盖两个方法 getItemId()getItemViewTyoe() 并在两者中返回位置。检查它是否在适配器中工作并发布适配器代码
  • 我添加了适配器

标签: java android listview arraylist


【解决方案1】:

假设 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);
    }
}

【讨论】:

  • 是的,尺寸不变
  • 我可以建议您更改适配器类的代码,这对我有用。
  • 那会很好:D
  • Inhalt 和 Merkmal 是 TextViews?
  • Merkmal 是 Textviews 而 Inhalt 是 Edittexts
【解决方案2】:

对于有同样问题的人: 我解决了在if(convertview == null) 中设置标签的问题,起初我试图将标签设置到if 方法中,但这对所有行都不起作用。

要将edittext'stag 放入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());
                }

希望有了这个答案,您不必像我一样花费太多时间来理解,标签必须设置在 iffunction 之外:D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多