2012-04-23 3 views
5

안드로이드 마켓과 같은 gridview를 만들고 싶습니다. 인터넷에있는 데이터베이스의 이미지로 채우고 싶습니다. 그것은 4.0까지 2.2를 실행하고 싶기 때문에 androidv4.support와 함께 작업해야합니다.방법 : 조각 내에서 gridview를 사용 하시겠습니까?

누군가는 4.0 이전 버전에서 그리드 뷰를 만들 수는 없다고 말 했나요?

그러나 setListAdapter()을 사용하면 작동하지만 목록보기처럼 한 줄에 하나의 이미지 만 표시됩니다. gridview.setAdapter()으로 변경하면 더 이상 작동하지 않습니다.

이는 ListFragment 클래스는 다음과 같습니다 :

public static class ArrayListFragment extends ListFragment implements OnScrollListener{ 

     ImageAdapter adapter = new ImageAdapter(); 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState); 


       LayoutInflater gridInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       View v = gridInflater.inflate(R.layout.imagelist, null); 
       GridView gridView = (GridView) v.findViewById(R.id.list); 




      ImageDownloader.Mode mode = ImageDownloader.Mode.CORRECT; 
//   ImageAdapter imageAdapter = new ImageAdapter(); 
      adapter.getImageDownloader().setMode(mode); 
      setListAdapter(adapter); 
//   gridView.setAdapter(adapter); 
      getListView().setOnScrollListener(this); 

     } 

이것은 ImageAdapter 클래스 : 누군가 샘플이있는 경우

public class ImageAdapter extends BaseAdapter { 

      private Context mContext; 

     private final ImageDownloader imageDownloader = new ImageDownloader(); 

      public static int count = 10; 

private final String[] URLS = { 
     "http://lh5.ggpht.com/_mrb7w4gF8Ds/TCpetKSqM1I/AAAAAAAAD2c/Qef6Gsqf12Y/s144-c/_DSC4374%20copy.jpg", 
     "http://lh5.ggpht.com/_Z6tbBnE-swM/TB0CryLkiLI/AAAAAAAAVSo/n6B78hsDUz4/s144-c/_DSC3454.jpg", 
     "http://lh3.ggpht.com/_GEnSvSHk4iE/TDSfmyCfn0I/AAAAAAAAF8Y/cqmhEoxbwys/s144-c/_MG_3675.jpg", 
     "http://lh6.ggpht.com/_Nsxc889y6hY/TBp7jfx-cgI/AAAAAAAAHAg/Rr7jX44r2Gc/s144-c/IMGP9775a.jpg", 
     "http://lh3.ggpht.com/_lLj6go_T1CQ/TCD8PW09KBI/AAAAAAAAQdc/AqmOJ7eg5ig/s144-c/Juvenile%20Gannet%20despute.jpg", 
     }; 

      public int getCount() { 
       return count; 
      } 

      public String getItem(int position) { 
       return URLS[position]; 
      } 

      public long getItemId(int position) { 
       return URLS[position].hashCode(); 
      } 
     public View getView(int position, View convertView, ViewGroup parent) { 
       View v; 

       if (convertView == null) { 
        v = LayoutInflater.from(mContext).inflate(R.layout.image_text_view,null); 
        v.setLayoutParams(new GridView.LayoutParams(200,200)); 

        ImageView imageview = (ImageView)v.findViewById(R.id.image); 
        imageview.setScaleType(ImageView.ScaleType.CENTER_CROP); 
        imageview.setPadding(6, 6, 6, 6); 
        imageDownloader.download(URLS[position], imageview); 
       } 
      else { 
       v = convertView; 
      } 

       return v; 
      } 

      public ImageDownloader getImageDownloader() { 
       return imageDownloader; 
      } 
    } 

그것은 많은 도움이 될 수

여기 내 시도이다. 감사합니다

답변

8

이 잘 작동합니다, 당신은 단지 ListFragment에있는 gridview를 사용할 수 없습니다 - 수동으로 그리드를 어쨌든 또한

, 지점 관리를 할 거라면 그냥 대신 평범한 구식 Fragment를 사용 convertView가 null인지 확인하는 것은 뷰 재활용을 수행하는 것입니다. OS는 화면을 채우는 데 충분한 뷰를 선언하고 더 이상 표시하지 않으므로 스크롤하면 새 뷰를 확장하지 않고 뷰를 다시 사용할 수 있습니다. 그래서 활용할처럼의 getView()을 최대 변경 :
public View getView(int position, View convertView, ViewGroup parent) { 
    View v; 

    if (convertView == null) { 
    v = LayoutInflater.from(mContext).inflate(R.layout.image_text_view,null); 
    v.setLayoutParams(new GridView.LayoutParams(200,200)); 
    } 
    else { 
    v = convertView; 
    } 

    ImageView imageview = (ImageView)v.findViewById(R.id.image); 
    imageview.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageview.setPadding(6, 6, 6, 6); 
    imageDownloader.download(URLS[position], imageview); 

    return v; 
} 

는 또한의 getView가 BaseAdapter의 함수가 아니다, 대신 ArrayAdapter와로 전환하려고합니다. 컴파일러는 당신에게 오류를 줄 것이다 그런 식으로 당신이보다 다르지 않을해야 FragmentGridView를 사용하여 실수

+0

작동하지만 지금은 이미지로 Gridview를 채우지 않고 getView에서 오류를 찾으려고합니다. – Marckaraujo

+0

@Marckaraujo가 GetView에 대한 참고 사항을 추가했습니다. 문제가 무엇인지는 모르지만 도움이 될 수 있습니다 - URL은 어디서 오는가? – JRaymond

+0

아직 URL이 어디에서 왔는지 보여주기 위해 코드를 업데이트합니다. – Marckaraujo

1

을 할 경우 - 당신이 기본 기능을 무시하고 생각하면 보조 노트로서, 항상 @Override를 사용 Activity에서 사용합니다. 코드에서 볼 수있는 눈에 띄는 오류 중 하나는 onActivityCreated에 레이아웃을 부 풀린 다음 즉시 무시한다는 것입니다. 대신 onCreateView에서보기 초기화를 모두 수행해야하는데 편리하게는 LayoutInflater을 제공합니다.

현재의 동작은 왜 그것이 어떻게 작동하는지 이해합니다. 나는 ListFragment이 프로그래머가 현재 제공하지 않는 것을 제공하지 않으면 ListView을 포함하는 레이아웃을 부 풀린다 고 생각한다. 그러면 설정중인 ImageAdapterListViewView을 제공하는 데 사용됩니다.

onActivityCreated에있는 코드를 모두 onCreateView으로 옮기면 올바르게 작동합니다. Fragment이 첨부되어있을 때 Activity과 함께 특별한 작업을 수행해야하는 경우를 제외하고는 onActivityCreated을 전혀 무시하지 않아도됩니다.

GridView 전 4.0 - GridView은 API 레벨 1부터 사용되어 왔기 때문에 모든 Android API 레벨에서 사용하는 것이 좋습니다.

+0

글쎄, 난 정말 모르겠지만 onActivityCreated, listview 함께 작동하도록 사용해야합니다, 또한 onCreateView 다음 응용 프로그램 충돌로 이동하려고했습니다. – Marckaraujo

관련 문제