2013-08-08 1 views
0

Facebook에서 가져온 사진이 포함 된 3 열과 여러 행이있는 GridView 레이아웃이 있습니다. 이미지를 선택하면 해당 항목에 대한 선택기가 gridView에 나타납니다. (나는 안드로이드 선택기를 사용하지 않지만 아래에 링크되어있는 맞춤 레이아웃을 사용하지 않습니다.)Android GridView 항목 선택기가 위치를 변경하고 복제합니다.

하나 이상의 항목을 선택하면 더 많은 사진을보기 위해 화면을 스크롤 할 때 다른 항목이 있음을 발견했습니다. 이미 선정되었습니다! 또한 이전에 선택한 항목을 보려고 스크롤하면 선택자의 위치가 바뀝니다. 그것은 내가 각 화면의 스크롤 할 때마다 각 선택기의 색인을 업데이 트하는 것 같습니다.

페이스 북에서 사진을 팽창시키기 위해 개인용 ImageAdapter를 만들었습니다. 여기 의 getView : 여기

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

     View v; 
     ImageView imageView = null; 
     if(convertView==null){ 
      LayoutInflater li = getLayoutInflater(); 
      v = li.inflate(R.layout.photos_item, null); 
     }else{ 
      v = convertView; 
     }  
     imageView = (ImageView)v.findViewById(R.id.image); 
     v.setTag(imageView); 
     if (arrayPhotos.get(position).getPictureSource() != null){ 
      Log.i(TAG, "Position in GridView = " + Integer.valueOf(position).toString()); 
      imageLoader.DisplayImage(arrayPhotos.get(position).getPictureSource(), imageView); 
     } 
     return v; 

    } 

onItemClick :

<GridView 
    android:id="@+id/gridview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:numColumns="auto_fit" 
    android:columnWidth="96dp" 
    android:stretchMode="spacingWidth" 
    android:horizontalSpacing="8dp" 
    android:verticalSpacing="8dp" 
    android:paddingTop="8dp" 
    android:paddingLeft="8dp" 
    android:paddingRight="8dp" > 
</GridView> 

그리고이은 XML 다음의 GridView의 XML이

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

View checkedItem; 

    checkedItem = (View) view.findViewById(R.id.check); 

    fbPicture = arrayFbPictures.get(position); 
    Log.i(TAG, "Position = " + arrayFbPictures.indexOf(fbPicture)); 
    Log.i(TAG, "PicId = " + fbPicture.getPictureID()); 

    if(fbPicture.isChoosed()){ 

     Log.i(TAG, "checkIcon DISACTIVATED"); 
     fbPicture.setChoosed(false); 
     checkedItem.setVisibility(View.INVISIBLE); 
     parent.invalidate(); 
    } 
    else{ 

     Log.i(TAG, "checkIcon ACTIVATED"); 
     fbPicture.setChoosed(true); 
     checkedItem.setVisibility(View.VISIBLE); 
     parent.invalidate(); 
    } 
} 

맞춤 선택 도구 :

<RelativeLayout 
    android:id="@+id/check" 
    android:layout_width="96dp" 
    android:layout_height="96dp" 
    android:background="@color/black_trasparency_light" 
    android:visibility="invisible" > 

    <ImageView 
     android:id="@+id/image_check" 
     android:layout_width="48dp" 
     android:layout_height="48dp" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentBottom="true" 
     android:scaleType="center" 
     android:src="@drawable/ic_check_colored_48" /> 

</RelativeLayout> 

고맙습니다.

답변

0

이유는 GridView가 뷰 재활용을 사용하기 때문입니다. GridView를 아래로 스크롤하면 아래쪽에 배치 할 새 뷰를 만드는 대신 GridView는 맨 위에서 사라지는 뷰를 다시 사용합니다. 이것은 getView() 호출 내에서 뷰의 상태를 완전히 설정해야한다는 것을 기억해야한다는 것을 의미합니다.

소화하기 조금 어렵다

, 그래서 여기에 몇 가지 코드입니다 :

public View getView(final int position, View convertView, ViewGroup parent) { 
    ... 

    View checkedItem = (View) v.findViewById(R.id.check); 

    fbPicture = arrayFbPictures.get(position); 
    if (fbPicture.isChoosed()) { 
    checkedItem.setVisibility(View.VISIBLE); 
    } else { 
    checkedItem.setVisibility(View.INVISIBLE); 
    } 

    return v; 
} 

위의 convertView의 체크 상태마다의 getView()를 설정하는 것입니다 코드라고, 그래서 재활용보기는 유지되지 않습니다 이전 상태의

추신. 이는 메모리를 절약하고 GridView 및 ListView의 성능을 향상시키기 위해 수행됩니다. 자세한 내용은이 awhome presentation을 시청할 수 있습니다.

+0

작동합니다! 고맙습니다 : D 나는 그것에 하루를 보냈습니다 : D – giangiska