2011-02-08 8 views
0

私の現在のプロジェクトでは、BaseAdapter(ガイドとしてチュートリアルのEfficientAdapterを使用)を拡張し、それぞれ独自のカスタムビューを持つ異なるカスタムセルタイプを扱いました。これらのセルタイプの中には、非同期操作(メディアの再生や記録など)を開始するものがあります。彼らが所属する活動がなくなると(いくつかの他の細胞タイプが起こる可能性がある)それらを一時停止したいと思います。特定のビューに、それが属する「ListActivity」がなくなることを通知する方法はありますか?カスタムアダプターが所有しているビューが消えていることをビューに通知するにはどうすればよいですか?

@Override 
public void onPause() { 
    super.onPause(); 

    for (int i = 0; i < adapter.getCount(); i++) { 
     CustomCellHolder holder = adapter./* Some magic goes here */; 
     holder.handlePause(); 
    } 
} 

が、私は、リストアダプタが所有するビューを反復処理する方法を見つけ出すことはできません。

私が最初に考えたのは活動のonPause()方法で意見を反復することでした。それを行う方法はありますか、または私は間違った木を吠えますか?あなたはArrayAdapterを使用している場合

public View getView(final int position, View convertView, ViewGroup parent) { 
    CustomCellHolder holder; 

    if (convertView == null) { 
     /* Create and cache a new view */ 
     holder = newHolderForItem(someArrayListOfObjects.get(position)); 

     holder.setItem(feature.attributes.get(position)); 
     holder.setActivity(MyListActivity.this); 

     convertView = holder.getView(); 
    } else { 
     /* Load a cached view */ 
     holder = (CustomCellHolder) convertView.getTag(); 

     holder.setItem(feature.attributes.get(position)); 
     holder.setActivity(MyListActivity.this); 
    } 

    holder.doSomeStuff(); 
    return convertView; 
} 
+0

私の意見では、どのようなロジック(再生/記録メディア)をしていても、ビューの責任を負わないほうがよいです。コードをリファクタリングして、onPauseでメディアを一時停止させることがアクティビティの責任となるようにします。 – gngr44

+0

これは確かに魅力的ですが、このアクティビティでは数多くの異なるタイプのビュー(および対応するホルダー/コントローラ)、場合によってはそれぞれのタイプのインスタンスがあります。セルごとのコントローラに責任を委譲するのではなく、(非常に長い)アクティビティにすべてのロジックを置くという見通しに戸惑う。 –

+0

その場合、リストビューの子を反復してみましたか?また、どのアダプターを使用していますか? – gngr44

答えて

2

リストビューの子を反復して、必要なカスタムビューを取得します。 View.getTagにホルダーがある場合はチェックできます(したがってセルの場合)。

0

、単に「のgetItem(ポジション)」メソッドを使用します。それは、関連するなら

は、私のGetViewメソッドは次のようになります。 Like:

CustomCellHolder holder = adapter.getItem(i);

+0

アレイアダプターを使用していない場合は同等ですか? –

+0

申し訳ありませんが、すべてのアダプタにこの方法があります!ちょうどそれを使用します。 ListViewの子を反復することは、それよりも高価です。 –

関連する問題