0

좋아, 그래서 사용자 정의 어댑터와 함께 그리드보기, 4 열을 사용하려고 해요. 매우 이상한 두 가지 문제가 발생했습니다.안드로이드 이상한 문제 GridView

문제 # 1 : 매우 이상합니다.로드 될 때 행 1 열 1이 비어 있습니다. 그런 다음 스크롤을 시작하면 첫 번째 행의 첫 번째 열이 비게됩니다. 그러나 맨 위로 다시 스크롤하면 그 빈보기가 나타납니다.

Issue # 2 : 일단 스크롤을 시작하면 맨 위로 빠르게 날아 가면 그리드가 경계를 넘고 아무 것도 볼 수없는 지점까지 스크롤하면 그리드를 스크롤 할 수 없습니다. 잃어 버렸거나 완전히 보이지 않습니다.

API 21을 타겟팅하므로 Lolipop 장치에 있습니다. 그러나 이것을 kitkat 4.4.2에서 테스트하고 똑같은 동작을 얻었습니다. 당신 그래서

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <GridView 
     android:id="@+id/gridView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:numColumns="4"/> 

</RelativeLayout> 

활동, 초기화 gridview에

 ArrayList<AppDetail> appList = getInstalledApps(); 

     AppGridAdapter adapter = new AppGridAdapter(this, android.R.layout.simple_gallery_item, appList); 

     GridView gridView = (GridView)findViewById(R.id.gridView); 
     gridView.setAdapter(adapter); 

AppGridAdapter.java (수입 제거)

public class AppGridAdapter extends ArrayAdapter<AppDetail> { 

    public AppGridAdapter(Context context, int rid, List<AppDetail> list) { 
     super(context, rid, list); 
    } 

    public View getView(int position, View view, ViewGroup parent) { 
     if (view == null) { 
      LayoutInflater inflater = 
        (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(R.layout.app_grid_item, parent, false); 

      // set width/height = 1/4 parent width 
      int len = parent.getWidth()/4; 
      AbsListView.LayoutParams params = (AbsListView.LayoutParams)view.getLayoutParams(); 
      params.width = len; 
      params.height = len; 
      view.setLayoutParams(params); 

      ViewHolder holder = new ViewHolder(); 
      holder.imgIcon = (ImageView)view.findViewById(R.id.imgAppIcon); 
      holder.tvLabel = (TextView)view.findViewById(R.id.tvAppLabel); 
      view.setTag(holder); 
     } 

     AppDetail app = getItem(position); 

     ViewHolder holder = (ViewHolder)view.getTag(); 

     holder.imgIcon.setImageDrawable(app.icon); 
     holder.tvLabel.setText(app.label); 

     return view; 
    } 

    private static class ViewHolder { 
     ImageView imgIcon; 
     TextView tvLabel; 
    } 
} 

: 여기

내의 GridView 레이아웃/초기화 활동 레이아웃입니다 코드가 매우 간단하고 간단하다는 것을 알 수 있습니다. 이것은 항상 내 사용자 지정 어댑터에 사용했던 형식입니다. 나는 그것에 대해 아무런 단서가 없다. 아이디어가 있으십니까? 감사합니다. .

+0

디버거 (또는 로깅)의 코드를 단계별로 실행하고 'parent.getWidth()'가 0이 아닌지 확인 했습니까? 가능한 유일한 문제일지도 모르는 것처럼 보입니다. 첫 번째 뷰를 가져올 때 너무 일찍 호출되었을 가능성이 있습니다. – blad

+0

아이는 이미 팽창 된 그 시점에서 팽창하기로되어 있기 때문에 나는 생각했다. 그러나 설명 된 몇 가지 항목을 제외하고는 다른 모든 항목이 올바르게 표시됩니다. –

+0

당신은 꽤 가까이에있는 것 같지 않아요. –

답변

0

BTellez가 옳았습니다. 문제는 팽창 할 때 뷰 경계를 변경하는 것이 었습니다. 그냥 그 블록을 제거하고 지금은 작동합니다.