2013-02-20 76 views
2

我有一个ListView,其中包含复选框,其行为有时像CHOICE_MODE_MULTIPLE,有时像CHOICE_MODE_SINGLE。我的意思是列表中的某些项目,当选择某些其他项目需要取消选择,而其他项目可以保持选择。如何在单击某个项目时更改Android ListView中的其他项目

所以当项目一个被选中,我可以在我的数据需要被选中,但我怎么拿到UI刷新,以显示这是我(我相信)无法找到实际的项目找到View,代表B但只是它的数据?

+0

我想通了,我可以用'getChildAt'和'getFirstVisiblePosition'找到实际的'View'我需要考虑的项目指标和减去'getFirstVisiblePosition返回的值更新'。 – bornander 2013-02-20 22:37:43

回答

0

可以使用singleChoice alartDialog,我已经使用,如:

private int i = 0; // this is global 
private final CharSequence[] items = {"Breakfast", "Lunch", "Dinner"}; // this is global 

Button settings = (Button)view.findViewById(R.id.settings); 

settings.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(final View v) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); 

    //Title of Popup 
    builder.setTitle("Settings"); 

    builder.setSingleChoiceItems(items, i, 
      new DialogInterface.OnClickListener() { 
     // When you click the radio button 
     public void onClick(DialogInterface dialog, int item){ 

      i=item; 
     } 
    }); 

    builder.setPositiveButton("Confirm", 
      new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int item) { 

      if (i == 0) { 
        //it means 1st item is checked, so do your code 
      } 
      if (i == 1) { 
      //it means 2nd item is checked, so do your code 
      } /// for more item do if statement  
     } 
    }); 
     //When you click Cancel, Leaves PopUp. 
     builder.setNegativeButton("Cancel", null); 
     builder.create().show(); 

    } 
}); 

因此,对于第一次上settings按钮用户点击,选择的第一个项目时,我已经初始化i=0。然后当用户选择其他项目后,我保存了i值,以便下次用户点击settings按钮时,我可以向用户显示他/她先前选择的项目。

0

这听起来像你是一个好开始。当你点击A时,你应该操纵项目B的底层数据源。

两个小技巧,可以帮助你:

  1. getView()在适配器方法应该是看你的数据源,并根据其发现改变convertView。您无法找到代表B的实际视图,因为在ListView中,Views将被回收并在需要显示不同的数据时重新使用。基本上,当一个项目从列表中滚动时,已使用的View作为convertView传递到getView()函数,准备处理下一个元素的数据。出于这个原因,您可能不应直接根据用户输入而改变View中的ListView,而应根据底层数据直接更改View
  2. 您可以在您的适配器中调用notifyDataSetChanged()来发出信号,指出底层数据已更改的某个位置,并且应该再次调用getView()以显示列表中当前显示的元素。

如果您仍然遇到问题,请随时发布一些代码,说明您遇到的具体问题。当问题得到更好的定义时,提供具体的建议会容易得多。希望这可以帮助!

0

我今天碰到并解决了这个问题。

public class ItemChooceActivity extends Activity implements OnItemClickListener { 

     private int chosenOne = -1; 

     class Madapter extends BaseAdapter { 
       ..... 
       ..... 
     @Override 
     public View getView(final int position, View convertView, 
      ViewGroup parent) { 
     // TODO Auto-generated method stub 

      if (chosenOne != position) { 
       set the view in A style 
      } else { 
       set the view in B style 
      } 

     return convertView; 
    } 
} 



     @Override 
     public void onItemClick(AdapterView<?> arg0, View view, int position, 
     long arg3) { 
    ,,,, 
     chosenOne = position; 
     adapter.notifyDataSetChanged(); 
     ,,, 
} 

}

相关问题