【问题标题】:Why multiple editext get focus inside listview with base adapter为什么多个edittext使用baseadapter在listview中获得焦点
【发布时间】:2023-03-23 00:51:02
【问题描述】:

我花了几天时间弄清楚这里发生了什么。

  • 带有自定义基础适配器的简单列表视图。
  • Listview 包含行。
  • 每行包含多个编辑文本。

|编辑文本 |第 1 行

|编辑文本 |第 2 行

|编辑文本 |第 3 行

|编辑文本 |第 4 行

问题是如果我在第 1 行输入 edittext,第 3 行的 edittext 会受到影响。它不仅复制文本,而且是焦点。如果我在第 2 行输入 edittext,第 4 行的 edittext 也会受到影响。

我使用了 ViewHolder 类。 我检查converView是否为空,然后将edittext初始化为ViewHolder,然后将其保存到converView的标签。 如果converView不为空,则复用converView,从converView的tag中获取ViewHolder。

请帮忙。

@Override
public View getView(int i, View converView, ViewGroup viewGroup) {

    ViewHolder holder;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (converView == null) {
        converView = inflater.inflate(R.layout.adapteraktivitasakhirpanen, null);

        holder = new ViewHolder();

        holder.tv = (TextView) converView.findViewById(R.id.tvPemanen);
        holder.atv1 = (AutoCompleteTextView) converView.findViewById(R.id.atvGandeng1);
        holder.atv2 = (AutoCompleteTextView) converView.findViewById(R.id.atvGandeng2);
        holder.atv3 = (AutoCompleteTextView) converView.findViewById(R.id.atvGandeng3);

        if (totalGandeng > 0) {
            holder.atv1.setMinWidth(toDP(200));
            adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, listGandeng1);
            holder.atv1.setAdapter(adapter);
            holder.atv1.setTag(i);
        }

        converView.setTag(holder);
    } else {
        System.out.println("converView not null");
        holder = (ViewHolder) converView.getTag();
    }
    holder.tv.setText(names.get(i));
}

static class ViewHolder {
    TextView tv;
    AutoCompleteTextView atv1;
    AutoCompleteTextView atv2;
    AutoCompleteTextView atv3;
}

谢谢

【问题讨论】:

  • 请检查我的代码
  • 您在哪个 android 版本中运行您的应用程序?
  • 不能使用那个答案。实际上我有 3 个编辑文本,正如您在我的 ViewHolder 中看到的那样,我还有另一个刷新这些 Autocompletetextview 的函数,结果是 StackOverFlowError。

标签: android android-listview android-edittext autocompletetextview


【解决方案1】:

解决问题的两种方法:

  1. 不要使用ListView 的缓存技术。所以你的代码会是这样的:

    public View getView(int i, View converView, ViewGroup viewGroup) {
        ViewHolder holder;
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        converView = inflater.inflate(R.layout.adapteraktivitasakhirpanen, null);
    
        holder = new ViewHolder();
    
        holder.tv = (TextView) converView.findViewById(R.id.tvPemanen);
        holder.atv1 = (AutoCompleteTextView) converView.findViewById(R.id.atvGandeng1);
        holder.atv2 = (AutoCompleteTextView) converView.findViewById(R.id.atvGandeng2);
        holder.atv3 = (AutoCompleteTextView) converView.findViewById(R.id.atvGandeng3);
    
        if (totalGandeng > 0) {
            holder.atv1.setMinWidth(toDP(200));
            adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, listGandeng1);
            holder.atv1.setAdapter(adapter);
            holder.atv1.setTag(i);
        }
    
        holder.tv.setText(names.get(i));
    }
    

此解决方案会使您的应用运行速度变慢。

  1. 如果你想使用这种缓存技术。您应该处理所有AuctoCompleteTextViewTextChangeListener 并且每次更改文本时都必须保存它,以便在Listview 再次创建项目视图时可以恢复它。

【讨论】:

  • 嗨 Cuong,请告诉我为什么我不应该使用 listView 的缓存?
  • 在我尝试了你的解决方案之后,实际上我应该同时使用这两种方法。因为每次视图滚动时,我的视图都会被回收,并且适配器会创建新视图。
  • 不能使用你的答案。实际上我有 3 个编辑文本,正如您在我的 ViewHolder 中看到的那样,我还有另一个刷新这些 Autocompletetextview 的函数,结果是 StackOverFlowError。
  • @rjrain 我认为您需要一个布尔标志来检查用户编辑文本时是否调用了 AutocompleteTextView 的 TextChangeListener。
【解决方案2】:

感谢您提供帮助。但我找到了适合我情况的更好方法。

所以我所做的是在构造函数中创建所有视图,然后在 getView() 上返回带有位置的视图。

public myAdapter(Context context, List<String> list) {
   this.context = context;
   this list = list;
   createAllView();
}

public void createAllView() {
   for (int i = 0; i < list.size(); i++) {
      /**
      * Create layout view using LayoutInflater
      */
      listView.add(view);
   }
}

public View getView(int pos, View converView, ViewGroup viewGroup) {
   return listView.get(pos);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多