2016-07-16 6 views
0

私はアンドロイドに新しいです、そして、この問題の解決のために数週間グーグルグーグルしています。本文にスピナーがあり、断片のスクロールビューにある拡張リストの先頭にテキストフィールドがあります。ヘッダーのテキストは正しく表示されますが、子ビューを表示/非表示にするとスピナー値が変わります。拡張リストビューのスピナーは、値が混ざり合っています

私は何が間違っているのか分かりません。私はここで何か助けていただければ幸いです。あなたはスピナーからタグにアクセスしようとしているが、あなたは、ExpandedListViewparent)にないスピナーのタグを設定している、スピナー、選択された値については

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

:ここ

アダプタです。しかし、それを修正しても、それはまだ動作しません。

ビューをリサイクルすると、リサイクルされたビューからスピナー値が取得されますが、リストがスクロールされてもスピナーの値は正しくなりません。

基本的にモデルデータではなく、モデルデータ(スピナー選択)をビューに保存しようとしています。

この作業を行うには、ints –のリストのリストと、グループの最初のリストと、子の2番目のリストのようなものが必要です。

それでは、選択を保存するためのプロパティを追加してみましょう。

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

アダプタの値は、正しい場所から来ているようです。ヘッダー値が重複していない限り、アダプター値の問題の原因がわかりません。 –

関連する問題