2016-07-16 18 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

適配器值看起來好像來自正確的位置。除非您有重複的標題值,否則我不知道適配器值的問題來自何處。 –