私が取り組んでいるアプリの場合、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: Android.widget.RelativeLayout@2c5f2920
08-27 14:16:56.628: D/Checks(15025): listItem2: Android.widget.RelativeLayout@2c06d938
08-27 14:16:56.628: D/Checks(15025): listItem1: Android.widget.RelativeLayout@2c72dfb0
08-27 14:16:56.628: D/Checks(15025): listItem2: Android.widget.RelativeLayout@2bfabe50
08-27 14:16:56.638: D/Checks(15025): listItem1: Android.widget.RelativeLayout@2c730c18
08-27 14:16:56.638: D/Checks(15025): listItem2: Android.widget.RelativeLayout@2c0d3e38
08-27 14:16:56.638: D/Checks(15025): listItem1: Android.widget.RelativeLayout@2c12ebc0
08-27 14:16:56.638: D/Checks(15025): listItem2: Android.widget.RelativeLayout@2bddbf70
08-27 14:16:56.648: D/Checks(15025): listItem1: Android.widget.RelativeLayout@2c131828
08-27 14:16:56.648: D/Checks(15025): listItem2: Android.widget.RelativeLayout@2bdf3270
08-27 14:16:56.648: D/Checks(15025): listItem1: Android.widget.RelativeLayout@2c140de0
08-27 14:16:56.648: D/Checks(15025): listItem2: Android.widget.RelativeLayout@2c0c8d30
listItem2は、ListView内の実際のビューを指します。これは、表示されているビューに対してのみ機能することを除いて、私が望むものです。ログファイルから、listItem1とlistItem2が対応していないことがわかります。
編集2:
私は次のことを思いついた:
for (int i = 0; i < mListView.getCount(); i++) {
RelativeLayout listItem = (RelativeLayout) mListView.getAdapter().getView(i, mListView.getChildAt(i), mListView);
}
これにより、リスト内のすべての表示アイテムのビューが正しく返されます。ただし、表示されていないビューには異なるビューが返されます。
編集3:
Nfirexのおかげで、私には実用的な答えがあります。これにより、ビューが直接見えなくても、ビューが返されます。
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);
}
}
メソッドが必要です Adapter.getView() :
final View view = mListView.getAdapter().getView(position, null, mListView);
更新:
メソッドを作成する必要があります。このようなもの:
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);
}
}
このコードを使用できます
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();
}
}
およびListViewgetChildViews()。