2010-11-18 89 views
1

我是新手,所以我可能无法很好地解释情况。如果您需要更多信息,请告诉我。如何在自定义列表视图中查找其他(复选框)视图

我想实现这样一个ListView:

[textview][button][checkbox] 
[textview][button][checkbox] 
[textview][button][checkbox] 
[textview][button][checkbox] 

我希望其他复选框将自动取消选中当我点击其中的一个。所以它就像一个单一的选择。我写下面的代码可以实现多种选择,但是当我尝试将它切换到单一选择时,我遇到了麻烦。

in checkBoxOnClickListener我找不到其他(复选框)视图并切换它们。任何建议好朋友?如果你认为我的快递技能很差,请告诉我。

谢谢。

public class MyAdapter extends SimpleAdapter { 

    Map<Integer, Boolean> map; 

    LayoutInflater mInflater; 

    private List<? extends Map<String, ?>> mList; 

    public MyAdapter(Context context, List<Map<String, String>> data, int resource, String[] from, int[] to) { 
     super(context, data, resource, from, to); 
     map = new HashMap<Integer, Boolean>(); 
     mInflater = LayoutInflater.from(context); 
     mList = data; 
     for (int i = 0; i < data.size(); i++) { 
      map.put(i, false); 
     } 
     if (data.get(0).get("value").equals("Male") || data.get(0).get("value").equals("Yes")) { 
      map.put(1, true); 
     } 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.rapid_diagnosis_row, null); 
     } 
     TextView textView = (TextView) convertView.findViewById(R.id.multiple_question); 
     textView.setText((String) mList.get(position).get("value")); 

     CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.multiple_checkbox); 
     checkBox.setChecked(map.get(position)); 

     // save position and checking status into tag 
     checkBox.setTag(position); 
     checkBox.setOnClickListener(checkBoxOnClickListener); 

     return convertView; 
    } 

    public OnClickListener checkBoxOnClickListener = new OnClickListener() { 
     public void onClick(View v) { 
      // ((CheckBox) v).toggle(); 
      boolean checked = ((CheckBox) v).isChecked(); 
      if (checked) { 
       ((CheckBox) v).setChecked(true); 
      } else { 
       ((CheckBox) v).setChecked(false); 
      } 
      int p = (Integer) (v.getTag()); 
      mSimpleAdapter.map.put(p, checked); 

          // this cannot works, helppp 
      ListView lv = ((ListView) (v.getParent().getParent())); 
      (CheckBox) cb = lv.findViewWithTag(1); 
      cb.toggle(); 
        ..................... 

............... } }; }

回答

1

findViewWithTag(1)是否返回null?这可能是findViewWithTag()不会递归搜索您的标记。如果你向上父母两次,让你在你的ListViewfindViewWithTag()将看到要标记的布局对象。

你应该通过每个ListView的孩子,然后找到每个人都拥有的复选框。从这里的代码片段很难说,但为什么你使用运行时间设置标签试图找到你的复选框,而不是ID?

+0

谢谢托马斯。问题解决了。其实我只需要在有两行的情况下做出单一选择。该代码丑陋,但工作:ListView lv =(ListView)(v.getParent()。getParent()); \t \t \t \t \t View view = lv.findViewWithTag(Math.abs(p - 1)); \t \t \t \t \t CheckBox cb =(CheckBox)(view.findViewById(R.id.multiple_checkbox)); \t \t \t \t \t cb.toggle(); – ThinkChris 2010-11-19 00:19:01

+0

我很高兴你能解决你的问题! :) – Thomas 2010-11-19 04:07:17

1

下面是用“的EditText”为例

v是调用视图

PV是其父

event_id_tag是我给它的主要活动标签。

public void onClick(View v) { 
    View pv = (View)v.getParent(); 
    EditText et = (EditText)pv.findViewWithTag("event_id_tag"); 
相关问题