1

我正在使用复选框创建具有多项选择的自定义列表。最后我设法设置在列表的项目选择事件上选中的复选框。

但是当我没有根据列表的选择选中复选框时,当我单击第一行时,第 4 行的复选框会自动被单击。总之顺序是不维护的。我正在工作的代码如下

  ListAdapter  adapter = new SimpleAdapter(
                    this,
                    Datalist ,
                    R.layout.customlist,
                    new String[] {"fileName","contentLength","keyPath"},
                    new int[] {R.id.title,R.id.size, R.id.path}
);
          setListAdapter(adapter);

protected void onListItemClick(ListView l, View v, int position, long id) {
            super.onListItemClick(l, v, position, id);
             ViewGroup group=(ViewGroup)v;
         CheckBox check=(CheckBox)group.findViewById(R.id.sharecheckbox); 
         check.toggle();
}
4

2 回答 2

1

ListView 用于维护列表项的重用,根据 Google I/O 的这个非常详细的解释

因此,check对于列表中的特定项目不会保持不变(即,如果 ListView 重绘它,它可能会变为未选中,或者其他项目可能会被选中)。

我建议维护自己的检查状态数组(在 onListItemClick() 中为其设置值):

  • 维护自己的“isChecked”,每次调用时Datalist使用自己设置正确的复选框状态;SimpleAdapter.ViewBindersetViewValue()
  • 扩展 ArrayAdapter 并检查状态绑定getView()
于 2011-11-09T07:15:14.910 回答
1
    ListView mainListView; 
    mainListView = (ListView) findViewById( R.id.mainListView );  

    // Create and populate a List of planet names.  
    String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars",  
                                      "Jupiter", "Saturn", "Uranus", "Neptune"};    
    ArrayList<String> planetList = new ArrayList<String>();  
    planetList.addAll( Arrays.asList(planets) );  

    // Create ArrayAdapter using the planet list.  
    listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, planetList);  

    // Add more planets. If you passed a String[] instead of a List<String>   
    // into the ArrayAdapter constructor, you must not add more items.   
    // Otherwise an exception will occur.  
    listAdapter.add( "Ceres" );  
    listAdapter.add( "Pluto" );  
    listAdapter.add( "Haumea" );  
    listAdapter.add( "Makemake" );  
    listAdapter.add( "Eris" );  

    // Set the ArrayAdapter as the ListView's adapter.  
    mainListView.setAdapter( listAdapter );        
  }  
}  
于 2012-10-19T10:23:51.363 回答