2016-07-16 19 views
0

我是Android新手,并且已经为此问题解决了数周的搜索问题。我在身体中有一个微调器,在扩展列表的头部有一个文本字段,它位于片段的滚动视图中。标题中的文本显示正确,但当我显示/隐藏子视图时,旋钮值会更改。Spinners在扩展列表视图中混淆了值

我不知道我在做什么错。我很感谢这里的任何帮助。

这里是适配器:

public class ExtendedListAdapter extends BaseExpandableListAdapter { 
    private Context ctx; 
    private LinkedHashMap<String, List<List<LinkedHashMap<String, String>>>> extendedListData; 
    private List<String> extendedListHeaders; 

    class Viewholder { 
     View rowView; 
     Spinner spnr; 
     TextView item1; 
    } 
    public ExtendedListAdapter(Context ctx, LinkedHashMap<String, List<List<LinkedHashMap<String, String>>>> extendedListData, List<String> extendedListHeaders) { 
     this.ctx = ctx; 
     this.extendedListData = extendedListData; 
     this.extendedListHeaders = extendedListHeaders; 
    } 

    @Override 
    public Object getChild(int parent, int child) { 
     return extendedListData.get(extendedListHeaders.get(parent)).get(child); 
    } 

    @Override 
    public long getChildId(int parent, int child) { 
     // TODO Auto-generated method stub 
     return child; 
    } 

    @Override 
    public View getChildView(int parentId, int childId, boolean lastChild, View convertView, 
          ViewGroup parentview) { 

     Viewholder v; 

     if (convertView == null) { 

      v = new Viewholder(); 

      LayoutInflater inflator = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflator.inflate(R.layout.child_layout, parentview, false); 

      v.rowView = convertView; 
      v.rowView.setTag(v); 
      v.item1 = (TextView) convertView.findViewById(R.id.textLabel); 
      v.spnr = (Spinner) convertView.findViewById(R.id.spinner1); 

     } 
     else { 
      v = (Viewholder) convertView.getTag(); 
     } 

     List<LinkedHashMap<String, String>> childListLinkedHashMap = (List<LinkedHashMap<String, String>>) getChild(parentId, childId); 
     LinkedHashMap<String, String> label = childListLinkedHashMap.get(0); 
     String[] items = new String[childListLinkedHashMap.size() - 1]; 

     v.item1.setText(label.get("name")); 

     for (int i = 1; i < childListLinkedHashMap.size(); i++) { 
      items[i - 1] = childListLinkedHashMap.get(i).get("name"); 
     } 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(ctx, android.R.layout.simple_spinner_dropdown_item, items); 

     v.spnr.setAdapter(adapter); 
     if (v.spnr.getTag() != null) { 
      v.spnr.setSelection((int) v.spnr.getTag()); 
     } 
     v.spnr.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, 
             int position, long id) { 
       parent.setTag(position); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       // TODO Auto-generated method stub 
      } 
     }); 

     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int arg0) { 

     return extendedListData.get(extendedListHeaders.get(arg0)).size(); 
    } 

    @Override 
    public Object getGroup(int arg0) { 
     // TODO Auto-generated method stub 
     return extendedListHeaders.get(arg0); 
    } 

    @Override 
    public int getGroupCount() { 
     // TODO Auto-generated method stub 
     return extendedListHeaders.size(); 
    } 

    @Override 
    public long getGroupId(int arg0) { 
     // TODO Auto-generated method stub 
     return arg0; 
    } 

    @Override 
    public View getGroupView(int parent, boolean isExpanded, View convertView, ViewGroup parentview) { 
     // TODO Auto-generated method stub 
     String group_title = (String) getGroup(parent); 
     if (convertView == null) { 
      LayoutInflater inflator = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflator.inflate(R.layout.parent_layout, parentview, false); 
     } 
     TextView parent_textview = (TextView) convertView.findViewById(R.id.parent_txt); 
     ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView); 
     parent_textview.setTypeface(null, Typeface.BOLD); 
     parent_textview.setText(group_title); 
     if (isExpanded) { 
      imageView.setImageResource(R.drawable.group_down); 
     } else { 
      imageView.setImageResource(R.drawable.group_up); 
     } 
     return convertView; 
    } 

    @Override 
    public boolean hasStableIds() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean isChildSelectable(int arg0, int arg1) { 
     // TODO Auto-generated method stub 
     return false; 
    } 



} 

回答

0

对于微调选择的值,你正试图从微调访问标签,但你设置标签上ExpandedListViewparent),微调。但即使你修正了这个问题,它仍然不起作用。

当视图被回收时,您将从回收视图中获取微调器值,这仍然会导致您的微调器在列表滚动时产生错误的值。

本质上,您正尝试在视图中存储模型数据(微调器选择),而不是模型中应该存在的数据。

为了完成这项工作,您需要类似于列表–第一个列表和第二个列表的子列表。

因此,让我们添加属性,用于存储选择:

private int[][] selected; 

你应该可以在这里使用数组,因为你的列表/地图似乎并不在尺寸上的变化。

设置它在构造函数中:

selected = new int[extendedListHeaders.size()][]; 
    for (int i = 0; i < selected.length; i++) { 
     int childSize = extendedListData.get(extendedListHeaders.get(i)).size(); 
     selected[i] = new int[childSize]; 
    } 

现在getChildView您的微调逻辑看起来就像这样:

 v.spnr.setSelection(selected[parentId][childId]); 

     v.spnr.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, 
            int position, long id) { 
       selected[parentId][childId] = position; 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { } 
     }); 

你需要做parentIdchildId参数final以在事件回调中使用它们。

通过使用模型数据设置模型数据和视图的事件回调,纺纱工应按照您的期望工作。

+0

谢谢克里斯,这有帮助。但我的问题是关于纺纱者的价值观,而不是选定的价值观。这里是回购,因为从示例中可以更容易地看到我的意思:[email protected]:fermicoding/lhapp.git – user12869

+0

适配器值看起来好像来自正确的位置。除非您有重复的标题值,否则我不知道适配器值的问题来自何处。 –