커스텀 그리드 뷰를 만들었습니다.
어댑터를 만들어
여기 그리드 뷰에 setAdapter를 해주었구요..
같은 방식으로 커스텀 리스트 뷰를 만들어 여기에 역시 다른 어댑터를 setAdapter 해주었습니다.
근데 리스트뷰는 문제가 없는데
그리드 뷰의 어댑터 뷰내의 getView 가 계속 불려집니다.
스크롤을 한것도 아니고..
setAdapter한 시점 부터 getView가 계속 불리는데 이유가 무엇인지 모르겠습니다.
조언 부탁드립니다.ㅠㅠㅠㅠ
아래와 같이 하였구요...ㅠㅠㅠ
참고로 그리드 뷰의 크기는 dp단위로 지정해주었구요.
3개의 그리드뷰가 존재합니다.
이 것이 원인이 될 수도 있을까요???
Aa = new AppAdapter(this, pkgAppsList);
gv_apps.setAdapter(Aa);
public class AppAdapter extends BaseAdapter {
List<ResolveInfo> child;
public AppAdapter(Context localContext, List<ResolveInfo> objects) {
child = objects;
}
public int getCount() {
return pkgAppsList.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater li = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
convertView = li.inflate(R.layout.listitem_apps, null);
}
ImageView icon = (ImageView) convertView.findViewById(R.id.ivIcon);
TextView name = (TextView) convertView.findViewById(R.id.tvName);
ResolveInfo temp = pkgAppsList.get(position);
icon.setImageDrawable(temp.loadIcon(getPackageManager()));
name.setText(temp.loadLabel(getPackageManager()));
name.setMaxLines(2);
name.setTextColor(Color.rgb(215, 215, 215));
Log.d("CHECK", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
return convertView;
}
}
답변 감사합니다. 리셋 하는 부분은 따로 없습니다.
이리저리 검색해보니, 부모 레이아웃의 width, height에 wrap이 없을 지라도 겟뷰가 계속 호출될 수가 있다네요ㅠㅠㅠ
계속 호출되도 문제없도록 코딩하라는 답변들이 많네요ㅠㅠ 휴 ㅠㅠ
일단 급한데로 아래와 같이 해결하였습니다.
반복 호출 시 position이 0이기 때문에
if(position == 0)
{
gridPos++;
}else
{
gridPos = 0;
}
if(gridAppPos < 2)
{
// 여기에 구현
}
frag님 말대로 어디선가 ListView를 다시 그려주지 않는 이상 호출되는 일은 없을 것 같은데...
그런데 반복 호출이 될 때 position이 0인 경우만 계속 호출되는 것도 좀 그렇군요..
제공한 자료로는 너무 일반적으로 사용하는 Adapter 소스코드 입니다.
그래서 이 정도 자료로는 원인을 찾을 수 없을 것 같습니다.
그리고 Adapter생성자에 파라미터로 넘겨준 list를 child로 받아놓고선.. 왜 pkgAppList로 사용하고 있나요?
호군님 답변 감사합니다.
child를 남겨 둔 것은 테스트겸 이것 저것 해보다가 지우지 못한것입니다.ㅠㅠ
말씀하신 대로 너무 일반적인 어댑터 소스코드이기 때문에 더 어이가 없습니다ㅠ
ListView가 아니라 GridView 사용중이구요.
똑같은 조건 적용하여 두개 비교시 그리드뷰만 무한 호출이 이뤄지구요...
간단하게 그리드 뷰 하나만 있는 액티비티 만들어서 테스트 해보았는데
이번엔 14번 불리네요..
정확한 원인을 모르겠습니다.
테스트 시
어래이에 2개의 스트링만 넣어줬구요
바로 getAdapter해주었구요.
어댑터는 위와 똑같구요.
아래는 xml이구요.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout android:layout_height="fill_parent" android:layout_width="fill_parent"> <GridView android:id="@+id/webGridView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:listSelector="@android:color/transparent" android:numColumns="auto_fit" android:columnWidth="100dp"/> </RelativeLayout> </RelativeLayout> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <RelativeLayout android:layout_width="100dp" android:layout_height="100dp"> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:layout_marginLeft="30dp" android:layout_marginTop="30dp" android:id="@+id/ivIcon"/> </RelativeLayout> <TextView android:text="@+id/TextView_video" android:layout_width="133dp" android:layout_height="10dp" android:layout_marginLeft="15dp" android:gravity="center" android:maxLines="1" android:textSize="20dp" android:id="@+id/tvName"/> </LinearLayout> 위에는 그리드 뷰 position마다 들어가는 요소들입니다.




처음 로딩될때 화면에 보여지는 갯수만큼은 getView() 가 호출 됩니다.
화면 아이템 갯수보다 많이 불려진다면 어디선가 ui 를 리셋하는 메서드를 쓰신게 아닌가 생각되어지네요