2013-08-27 11 views
17

私が作業しているアプリケーションでは、ListViewの子を取得しようとしています。これを行うには、私は次のコードを持っています:ListViewを表示しない子を表示する

View listItem = mListView.getChildAt(i); 

しかし、これは表示されている子供のためにのみ動作します。私はまた、見えていない子供達に連絡する必要があります。どうすればいい?

編集:私が欲しいものであるリストビューでは、実際のビューに

RelativeLayout listItem1 = (RelativeLayout) mListView.getAdapter().getView(i, null, mListView); 
RelativeLayout listItem2 = (RelativeLayout) mListView.getChildAt(i); 
Log.d("Checks", "listItem1: " + listItem1); 
Log.d("Checks", "listItem2: " + listItem2); 

08-27 14:16:56.628: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.628: D/Checks(15025): listItem2: [email protected] 
08-27 14:16:56.628: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.628: D/Checks(15025): listItem2: [email protected] 
08-27 14:16:56.638: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.638: D/Checks(15025): listItem2: [email protected] 
08-27 14:16:56.638: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.638: D/Checks(15025): listItem2: [email protected] 
08-27 14:16:56.648: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.648: D/Checks(15025): listItem2: [email protected] 
08-27 14:16:56.648: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.648: D/Checks(15025): listItem2: [email protected] 

listItem2ポイント:

は、私はすでに、私は次のことを見つける使用していたものと示唆された方法を比較すると、見えているビューに対してのみ機能します。ログファイルから、listItem1とlistItem2が対応していないことがわかります。

EDIT 2:

私は、次のを思い付いた:

for (int i = 0; i < mListView.getCount(); i++) { 
    RelativeLayout listItem = (RelativeLayout) mListView.getAdapter().getView(i, mListView.getChildAt(i), mListView); 
} 

これは、リスト内のすべての表示項目に対して正しくビューを返します。ただし、表示されていないビューについては別のビューを返します。

EDIT 3:

おかげで、私は作業答えを持っているnfirexします。彼らは目の前で直接でなくてもこれは、ビューを返します。

final View view = mListView.getAdapter().getView(position, null, mListView); 

UPDATE:あなたのメソッドを作成する必要が

public View getViewByPosition(int position, ListView listView) { 
    final int firstListItemPosition = listView.getFirstVisiblePosition(); 
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1; 

    if (position < firstListItemPosition || position > lastListItemPosition) { 
     return listView.getAdapter().getView(position, listView.getChildAt(position), listView); 
    } else { 
     final int childIndex = position - firstListItemPosition; 
     return listView.getChildAt(childIndex); 
    } 
} 

答えて

33

あなたが方法Adapter.getView()が必要です。このような何か:

public View getViewByPosition(int position, ListView listView) { 
    final int firstListItemPosition = listView.getFirstVisiblePosition(); 
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1; 

    if (position < firstListItemPosition || position > lastListItemPosition) { 
     return listView.getAdapter().getView(position, null, listView); 
    } else { 
     final int childIndex = position - firstListItemPosition; 
     return listView.getChildAt(childIndex); 
    } 
} 
+2

これは本当にビューを返します。しかし、私はそれが私が望む実際のものの代わりに新しいビューを返すと思います。 – Zero

+0

@Zero どのビューを取得する必要がありますか? メソッドListView.getChildAt(i)はアダプタから早期に取得した子(ViewGroupのメソッド)を返します。 Adapter.getView(pos、oldView、parent)は、新しいリスト(oldView == nullの場合)またはoldViewに、データリストの要素の位置によってAdapter.getItem(pos)に含まれるデータを返します。 インデックスでListViewに保持されているビューを受け取りたいですか? – nfirex

+1

私はgetChildAt(i)でもViewを取得しようとしていますが、Viewには表示されません(画面に8つの項目があり、getChildAt(10)を要求しています。私はNullPointerExceptionを取得します) – Zero

2

あなたはこのコード

private static void initRecyclerBin(AbsListView view) { 
     try { 
      Field localField = AbsListView.class.getDeclaredField("mRecycler"); 
      localField.setAccessible(true); 
      Object recyclerBin = localField.get(view); 
      Class<?> clazz = Class.forName("android.widget.AbsListView$RecycleBin"); 
      Field scrapField = clazz.getDeclaredField("mScrapViews"); 
      scrapField.setAccessible(true); 
      ArrayList<View>[] scrapViews; 
      scrapViews = (ArrayList<View>[]) scrapField.get(recyclerBin); 
      if (null != scrapViews) { 
       int length = scrapViews.length; 
       for (int i = 0, count = 0; i < length; i++) { 
        if (null != scrapViews[i] && !scrapViews[i].isEmpty()) { 
         for (int j = 0; j < scrapViews[i].size(); j++) { 
          scrapViews[i].get(j);//this is the scrapViews 
         } 
        } 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

とリストビューgetChildViews()を使用することができます。

関連する問題