为什么多个edittext使用baseadapter在listview中获得焦点

时间:2014-10-07 04:17:56

标签: android android-listview android-edittext autocompletetextview

我花了好几天才弄清楚这里发生了什么。

  • 使用自定义基础适配器的简单列表视图。
  • Listview包含行。
  • 每行包含多个edittext。

| edittext |第1行

| edittext |第2行

| edittext |第3行

| edittext |第4行

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

我使用了ViewHolder类。 我检查converView是否为空,然后将edittext初始化为ViewHolder,然后将其保存到converView的标签。 如果converView不为空,则重用converView并从converView的标记中获取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;
}

由于

2 个答案:

答案 0 :(得分: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));
    }
    
  2. 此解决方案会让您的应用运行速度变慢。

    1. 如果要使用此缓存技术。您应该处理所有AuctoCompleteTextView TextChangeListener,并且每次更改文本时都必须保存,以便在Listview再次创建项目视图时还原它。

答案 1 :(得分:0)

感谢您的帮助。但是我找到了一个更适合我案例的方法。

所以我做的是在构造函数中创建所有视图,然后返回带有位置的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);
}