2016-05-18 16 views
0

私はExpandableListViewを持っており、各グループには多くのグループと子供がいます。私は、起動時にExpandableListViewを表示する必要がありますが、複数のバックグラウンドスレッドでロードする各行の情報があり、個々の子行をスレッドごとに更新する必要があります。 をベースアダプターに渡し、intをグループ位置の番号にします。誰も私は完璧に1つの子行を更新することができ、私の問題にいくつかの光を当てることができる方法を知っていますか?私に教えてください、ありがとうございました。ExpandableListViewで1つの子ローを更新するにはどうすればよいですか?

これまでのところ私が持っている:あなたは

  var dictionary = _adapter.groupDictionary; 
      var rowToUpdate = dictionary.Where(k => k.Value.Any(m => m.Id == _id)) 
       .ToDictionary(n => n.Key, n => n.Value.Where(o => o.Id == _id).ToList()); 

      int groupPosition = rowToUpdate.Keys.FirstOrDefault(); 
      int childPosition = dictionary.Values.FirstOrDefault().IndexOf(rowToUpdate.Values.FirstOrDefault().FirstOrDefault()); 

      ExpandableListView listView = mView.FindViewById<ExpandableListView>(Resource.Id.listView); 
      var flatPosition = listView.GetFlatListPosition(groupPosition); 
      int first = listView.FirstVisiblePosition; 
      var v = listView.GetChildAt(flatPosition - first); 

      if (v == null) 
       return; 

      TextView someText = (TextView)v.FindViewById(R.id.sometextview); 
      someText.SetText("Hi! I updated you manually!"); 
+0

あなたはこれまでに何を試しましたか?コードのスニペットを投稿すると誰もがあなたにうまく答えるのを助けることができます –

+0

@RalphMelhem私は 'getChildAt'を試して、' getFlatListPosition() - firstVisiblePosition() 'を渡しましたが、私が望むものを達成するのに近くなっていないようで、グループと子供の両方に合格する方法でした。私はこれが助けになるなら、すぐに私の試みを掲載することができます。 – imageobject

+0

あなたの質問を編集し、関連するコードを投稿してください(活動) –

答えて

0

よりもむしろのTextViewを更新するアダプタ内のデータを更新し、notifyDataSetChangedを呼び出す必要があります。あなたは(私はあなたが私ができる最善のようにC#で持っているものに一致するJavaでそれを置く)を呼び出して子ビューのインデックスを取得しているところで行うことができます。

_adapter.dictionary.set(group, child); 
グループは、グループ情報と子であるである

子データデフォルトExpandableListAdapterで、グループのデータが

List<String> _listDataHeader 

に格納され、子データが

HashMap <String, List<String>> _listDataChild 
に格納されています。かなり手波状に聞こえるので、私はさらに説明します


各ヘッダー文字列は、子文字列のリストにマップされます。カスタムアダプタを実装した場合

は、おそらく_listDataHeaderのあなた相当

List <CustomHeaderData> 

であるように、ヘッダデータと子データのためのいくつかのクラスを作り、あなたの_listDataChildは

HashMap <CustomHeaderData, List<CustomChildData>> 

かであります似たような。

getChildViewメソッドでは、_listDataChildおよび_listDataHeaderを使用してCustomChildData(またはデフォルトでString)を取得し、データから適切な子ビューフィールドを設定する必要があります(デフォルトでTextViewテキストをStringに設定します)。したがって、子ビューの外観を更新するには、_listDataChildの適切なエントリを更新し、notifyDataSetChanged()を呼び出します。必要に応じて適切な子を再描画します(以下の例を参照)。

// Indices from your code 
    int groupPosition = rowToUpdate.Keys.FirstOrDefault(); 
    int childPosition = dictionary.Values.FirstOrDefault().IndexOf(rowToUpdate.Values.FirstOrDefault().FirstOrDefault()); 

    // Get the child from the adapter lists 
    CustomGroupData groupData = _listDataHeader.get(groupPosition); // Key for _listDataChild 
    List<CustomChildData> childDataList = _listDataChild.get(groupData) ; // List of children 
    CustomChildData childData = childDataList.get(childPosition) 

    // Make edits to the child as needed 
    childData.setSomeDataField("Hi! I updated you manually!"); 

    // Replace the old child list with an updated list (with updated child) 
    childDataList.set(childPosition, childData); 
    _listDataChild.put(groupData, childDataList); 

    // Tell the adapter to redraw 
    notifyDataSetChanged(); // If this function is outside the adapter, 
    // this will have to be called with the instance of your adapter 
    // i.e. mAdapter.notifyDataSetChanged(); 
関連する問題