2017-01-10 8 views
0

アダプタを使用して子ビューを再利用しているGridViewがあります。それぞれの子ビューは、上に重ねてTextViewを持つImageViewで構成されています。私が見ている問題は、スクロールして新しい画像を表示すると、グリッド内の他のセルの画像も表示される画像に変わることがあります。GridViewはまだ表示されている子ビューをリサイクルします

私は新しい行が見えてくるとき、getViewメソッドは、()新しい行のビューを取得するためのアダプタで呼び出されるためであると見ることができ、デバッグした後。しかし、ビューはメソッドに渡され、アンドロイドは私がリサイクルしたい、実際にはまだ見ている。だから、私が与えるビューのイメージを更新すると、グリッド内の別のアイテムのイメージも変わってしまいます。

これを引き起こす可能性があることは誰にも分かりますか?

活動

<android.support.v4.widget.SwipeRefreshLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/snapshot_list_swipe_refresh" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_snapshot_list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.vellocet.snapshotviewer.SnapshotListActivity"> 

    <GridView 
     android:id="@+id/snapshot_grid" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_margin="5dp" 
     android:drawSelectorOnTop="true" 
     android:gravity="center" 
     android:numColumns="2" 
     android:stretchMode="columnWidth" 
     android:verticalSpacing="0dp" 
     android:horizontalSpacing="0dp" 
     android:focusable="true" 
     android:clickable="true"/> 

</RelativeLayout> 

</android.support.v4.widget.SwipeRefreshLayout> 

アダプタ:任意の助け

+0

アダプターコード全体ですか?また、リサイクルされたビューがまだ画面上に表示されているとはどのように判断しましたか? – Karakuri

+0

これは、GetSnapshotCallback実装と、子ビューでクリックリスナーを設定するコードを除いたものです。 getViewに渡されたビューのタグには、一番上の行の項目の1つのタグが含まれているため(スクロールしている場合)、まだ表示されています。 – dco123

+0

また、デバッガで渡されたビューのオブジェクトIDは、以前に作成されたものと一致します。 – dco123

答えて

0

私のミスのため

private class SnapshotListAdapter extends BaseAdapter { 
    private final Context context; 
    private List<Snapshot> snapshots; 

    public SnapshotListAdapter(Context context, List<Snapshot> snapshots) { 
     this.context = context; 
     snapshots = snapshots; 
    } 

    @Override 
    public int getCount() { 
     return snapshots.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return i < snapshots.size() ? snapshots.get(i) : null; 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     ViewHolder viewHolder; 

     if (view == null) { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      view = inflater.inflate(R.layout.snapshot_grid_item_layout, viewGroup, false); 
      viewHolder = new ViewHolder(); 
      viewHolder.image = (ImageView)view.findViewById(R.id.snapshot_grid_item_imageview); 
      viewHolder.text = (TextView) view.findViewById(R.id.snapshot_grid_item_textview); 
      view.setTag(viewHolder); 

      view.setLayoutParams(new GridView.LayoutParams(
        GridView.LayoutParams.MATCH_PARENT, 
        (int)getResources().getDimension(R.dimen.snapshot_grid_item_height))); 
     } 
     else { 
      viewHolder = (ViewHolder)view.getTag(); 
     } 

     final Snapshot snapshot = snapshots.get(i); 
     viewHolder.snapshot = snapshot; 
     viewHolder.image.setImageDrawable(null); 
     viewHolder.updateText(); 

     snapshot.getSnapshotFiles(new GetSnapshotCallback(viewHolder, snapshot)); 

     return view; 
    } 
} 

感謝。画面上にまだ表示されているビューはリサイクルされていますが、元の位置に対して新しいビューが作成されます。

例えば位置0が画面に表示されている、あなたがビューに位置8をもたらすためにスクロールすると、位置0のためのビューが位置0は、画面上に残っているにもかかわらず、位置8にリサイクルされます。ただし、位置0の別のcreateViewを呼び出し、リサイクルビューを渡さないので、新しいインスタンスが作成されます。やや奇妙なプロセスですが、複数の画像ビューに画像が表示されているのを見て問題を引き起こしていません。

関連する問題