2016-05-17 13 views
1

Activityでは、最初のグループビューExpandable ListViewにアクセスできますか?ここでExpandable ListViewの最初のグループのビューのハンドルを取得

は私がやっているものです:

public int getFirstVisibleGroup() { 
     LogUtil.i(TAG, "getFirstVisibleGroup called"); 
     int firstVis = listView.getFirstVisiblePosition(); 
     LogUtil.i(TAG, "firstVis = " + firstVis); 
     long packedPosition = listView.getExpandableListPosition(firstVis); 
     LogUtil.i(TAG, "packedPosition = " + packedPosition); 
     LogUtil.i(TAG, "firstVisibleGroup = " + ExpandableListView.getPackedPositionGroup(packedPosition)); 
     return ExpandableListView.getPackedPositionGroup(packedPosition); 
    } 

    public View getGroupView(ExpandableListView listView, int groupPosition) { 
     LogUtil.i(TAG, "getGroupView called"); 
     int flatPosition = listView.getFlatListPosition(groupPosition); 
     LogUtil.i(TAG, "flatPosition = " + flatPosition); 
     int first = getFirstVisibleGroup(); 
     LogUtil.i(TAG, "first = " + first); 
     LogUtil.i(TAG, "returning child at position " + (flatPosition - first)); 
     return listView.getChildAt(flatPosition - first); 
    } 

をそして私はそれを呼び出す:最終的にそれはlistView.getChildAt(0)なっ

View view = getGroupView(listView, 0); 

。返されたviewはnullです。

正しい方法は何ですか?彼らは画面上にレイアウトされた後

+0

いつ 'listView.getChildAt(0)'を呼び出そうとしていますか?それはonCreate/onResumeの間ですか?またはユーザーがビューをクリックした後ですか? 'のonCreate()'で – Budius

+0

@Budiusは、私は、サービスコールを行い、サービスコールの結果が来たとき、私は '拡張ListView'を更新し、その後、私は上記のメソッドを呼び出します。 –

答えて

1

すべてのアダプタベースのビュー(ListViewコントロール、GridViewの、RecyclerViewは)自分自身だけにビューを追加します。十分な子ビューのために適切なサイジングとクエリを計算できるようにします。

そのため、onCreateの間にあなたは決して決して見ることはありません。つまり、子ビューの一部と対話したい場合は、後で実行する必要があります。

適切なアプローチの1つは、リスナーOnPreDrawを使用することです。これは、システムがdraw(canvas)を呼び出した直前です。例:

public MyActivity extends Activity implements ViewTreeObserver.OnPreDrawListener { 

    @Override 
    public void onCreate(bundle){ 
     ... build your layout and your listview 

     // during onCreate you add a PreDrawListener 
     rootView.getViewTreeObserver().addOnPreDrawListener(this); 
    } 

    @Override 
    public void onPreDraw() { 

     ... do your logic here !!! 


     rootView.getViewTreeObserver().removeOnPreDrawListener(this); // remove itself, you only need the fist pass 
     return true; // must return true, or else the system won't draw anything. 
    } 

} 
+0

私はまだ 'view'を' null'として取得しています。加えて、 'onPreDraw()'はネットワーク応答が来る前に呼び出されます。 –

+0

ああ...私はあなたがネットワークについて言った部分を逃したと思う。考え方は同じである。しかし、それは 'それが画面上に再び描く右の前に呼び出されますPreDraw'です。それは正しい 'setAdapter'または' notifyDataSetChanged'を呼び出した後、あなたの場合、あなたがしなければならない 'addOnPreDrawListener'するための手段。 – Budius

+0

私はそれを試みます。 –

関連する問題