2011-11-02 67 views
0

公共类ArrayAdapter时遇到麻烦延伸ArrayAdapter {自定义多种可选的ListView在Android中,滚动

private final List<String> list; 
    private final Activity context; 

    public ArrayAdapter_DiscountList(Activity context, List<Class_Model> list) { 
     super(context, R.layout.list, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected ToggleButton toggle; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 

     LayoutInflater inflator = context.getLayoutInflater(); 
     view = inflator.inflate(R.layout.list, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) view.findViewById(R.id.list_item_name);    
     viewHolder.toggle = (ToggleButton) view.findViewById(R.id.checkbox_toggle); 
     viewHolder.toggle.setVisibility(View.VISIBLE); 

     // TODO Auto-generated method stub 
       viewHolder.toggle.setOnCheckedChangeListener(
       new CompoundButton.OnCheckedChangeListener() 
       { 
        @Override 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
        { 
          String element = (String) viewHolder.toggle.getTag(); 
          element.setSelected(buttonView.isChecked()); 

          if(isChecked) 
          { 
           ArrFDItem.add(list.get(position).getName());  
          }else 
          { 
           ArrFDItem.remove(list.get(position).getName()); 

          } 
        } 
       }); 


     view.setTag(viewHolder); 
     viewHolder.toggle.setTag(list.get(position)); 
     } else { 
     view = convertView; 
     ((ViewHolder) view.getTag()).toggle.setTag(list.get(position)); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(list.get(position).getName()); 
     holder.toggle.setChecked(list.get(position).isSelected()); 

     return view; 
    } 

}

工作正常,但scrollng列表视图时,它的去除列表中的项目,以及与postion of list.get(position).getName();仅获得0-5(一次只有6个列表项目在列表视图中可见)。我必须在列表中选择更多项目,并且必须根据列表中的切换选择来添加/删除。请帮忙。感谢你...

回答

0

没有设备来测试你的代码(在我的笔记本电脑上),我想说你的问题是由于你如何回收你的视图。想一想ArrayAdapter#getView()的回收工作情况。也许你需要将convertView == null条件中的一些代码移到if/else块的外部?为了确认这是问题所在,你可以不回收任何东西,并且每次只提供一个新视图(当然,如果你的列表可能变得非常大,这可能不是有效的,但是对于用足够大的列表进行测试应该没问题必须滚动一下)。

希望能帮到现在,明天会有更多的样子。

编辑:再看看代码,似乎有一些问题。你的模型的类型究竟是什么?因为你的构造函数中有List<Class_Model>(你应该避免在类名中使用下划线),但是在你的实例变量list中使用List<String>。我很难告诉你想要做什么,而不知道列表中需要哪一个 - 仅仅是显示一些文本(在这种情况下,String会这样做),还是需要更复杂的行为(在这种情况下你需要一个模型对象)。

以下是一些基于假设的代码,您需要定义某种类型的ClassModel,并且您的ArrFDItem(无论那是什么)是局部变量。这两种假设都可能是错误的,但我鼓励你考虑为什么我会做出这些假设......并将你的代码与下面的代码进行比较,以查看发生了什么变化。

public class ArrayAdapterDiscountList extends ArrayAdapter<ClassModel> { 
    protected final List<ClassModel> list; 
    private final Activity context; 
    protected List<String> arrFdItems; 

    public ArrayAdapterDiscountList(Activity context, List<ClassModel> list) { 
     super(context, R.layout.list, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected ToggleButton toggle; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if (convertView == null) { 

      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.list, null); 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) view.findViewById(R.id.list_item_name); 
      viewHolder.toggle = (ToggleButton) view.findViewById(R.id.checkbox_toggle); 
      viewHolder.toggle.setVisibility(View.VISIBLE); 

      viewHolder.toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        ClassModel element = (ClassModel) viewHolder.toggle.getTag(); 
        element.setSelected(buttonView.isChecked()); 

        if (isChecked) { 
         arrFdItems.add(list.get(position).getName()); 
        } else { 
         arrFdItems.remove(list.get(position).getName()); 
        } 
       } 
      }); 

      view.setTag(viewHolder); 
      viewHolder.toggle.setTag(list.get(position)); 
     } else { 
      view = convertView; 
      ((ViewHolder) view.getTag()).toggle.setTag(list.get(position)); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(list.get(position).getName()); 
     holder.toggle.setChecked(list.get(position).isSelected()); 

     return view; 
    } 

    public class ClassModel { 
     private String name; 
     private boolean isSelected; 

     public String getName() { 
      return name; 
     } 

     public boolean isSelected() { 
      return isSelected; 
     } 

     public void setSelected(boolean aBoolean) { 
      isSelected = aBoolean; 
     } 
    } 
} 

如果没有帮助,你需要回到基础知识,阅读一些教程,并试图按照他们一步一步,直到你得到它的窍门。我可以推荐vogella.de网站上的那些,例如http://www.vogella.de/articles/AndroidListView/article.html

+0

嗨,第一次感谢您的回复。不知何故,我知道在滚动列表时回收convertview。但无法得到确切的解决方案。请看看问题,我已经退出了。 – Pankaj

+0

嗨aaamos, 感谢您解释清楚的答案,但我很抱歉,它不适合我。无论如何感谢您的关心,我会通读您提供的文章。关于ClassModel,它被错误地改为String。这与你解释的一样。 再次感谢你.... – Pankaj