2013-04-27 5 views
10

사용자 지정 어댑터ListFragment이 있지만 어댑터 getView()이 전혀 호출되지 않습니다.사용자 지정 어댑터 getview가 호출되지 않았습니다.

public class ModuleListItemAdapter extends BaseAdapter { 

    List<ModuleItem> list; 
    Context context; 
    Module mod; 

    public ModuleListItemAdapter() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    public ModuleListItemAdapter(Context context, List<ModuleItem> list, Module mod) { 
     super(); 
     this.list = list; 
     this.context = context; 
     this.mod = mod; 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     RelativeLayout rl = (RelativeLayout) inflater.inflate(R.layout.moduleitem, null); 
     GenerateModuleItemView gmiv = new GenerateModuleItemView(context); 
     rl.addView(gmiv.itemDispView(mod.getFields(), list.get(position))); 
     return rl; 
    } 

    public void setValue(List<ModuleItem> l) { 
     this.list = l; 
     notifyDataSetChanged(); 
    } 

    public void addValue(ModuleItem item) { 
     this.list.add(item); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 

그리고 조각 - -

public class ModuleItemListFragment extends ListFragment { 

    List<ModuleItem> list; 
    Module mod; 

    public ModuleItemListFragment() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    public ModuleItemListFragment(List<ModuleItem> list, Module mod) { 
     super(); 
     this.list = list; 
     this.mod = mod; 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     return inflater.inflate(R.layout.list, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     ModuleListItemAdapter adapter = new ModuleListItemAdapter(getActivity(), list, mod); 
     setListAdapter(adapter); 
    } 
} 

그리고이 같은 내 레이아웃 모습입니다 - 내가하지

<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@android:id/list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:divider="#000000" 
      android:dividerHeight="1dip" /> 

어댑터가 어떻게 보이는지

입니다 문제가 뭔지 알아.

+2

'@Override public int getCount() { return list.size(); }'. 질문을하기 전에 google을 사용하십시오. – Luksprog

+0

@Luksprog가 작동하지 않습니다. – Akilan

+2

Luksprog가 말했듯이 getCount에 뭔가를 추가해야합니다. 0을 원한다고 생각하면보기를 만들지 않으려합니다. – alex

답변

32

getCount()는 0을 반환하기 때문입니다. getCount()에서 반환하는 숫자는 getView()가 호출되는 시간입니다. getCount()에서 항상 목록의 크기를 반환해야합니다.

따라서

또한
@Override 
public int getCount() { 
    return list.size(); 
} 

@Override 
public ModuleItem getItem(int position) { 
    return list.get(position); 
} 

, 어쩌면 레이아웃의 ListView에 ID가 android.R.id.list되지 않는 이유는 무엇입니까?

적 생성자에서 조각에 데이터를 전달하지 않습니다 당신이 XML

또한
<ListView 
    android:id="@android:id/list" 
    ... 

에 있는지 확인합니다.

잘못된 :

public ModuleItemListFragment(List<ModuleItem> list,Module mod) { 
    super(); 
    this.list=list; 
    this.mod=mod; 
} 

: 물론

private static final String EXTRA_LIST = "ModuleItemListFragment.EXTRA_LIST"; 
private static final String EXTRA_MODULE = "ModuleItemListFragment.EXTRA_MODULE"; 

public static ModuleItemListFragment instantiate(ArrayList<ModuleItem> list, Module mod) { 
    final Bundle args = new Bundle(); 
    args.putParcelable(EXTRA_LIST, list); 
    args.putParcelable(EXTRA_MODULE, module); 

    final ModuleItemListFragment f = new ModuleItemListFragment(); 
    f.setArguments(args); 
    return f; 
} 

@Override 
public void onCreate(Bundle state) { 
    super.onCreate(state); 
    final Bundle args = getArguments(); 
    this.list = args.getParcelable(EXTRA_LIST); 
    this.module = args.getParcelable(EXTRA_MODULE); 
} 

, 당신이 당신의 모듈 Parcelable 또는 직렬화를해야한다.

Fragment가 시스템에 의해 강제 종료 및 복원 될 수 있기 때문에 args를 지정해야하며 setter 또는 생성자를 통해 데이터를 전달하면 복원되지 않으므로 일부 상황에서는 null이 될 수 있습니다.

+0

고마워요 .. :) 수업은 길을 따라 실수를 배웠습니다 .. : P – Akilan

0

제 경우에는 동일한 문제가 있습니다. 내 Fragment 생성자에서 내 로컬 배열 목록을 초기화하지 않았습니다.

ArrayList<Image> mImageList; 

public ImageCategoryAdapter(Context context, ArrayList<Image> itemList) { 
    super(context, 0); 

    mImageList = itemList; 
} 

나는 mImageList = itemList; 부분을 놓쳤습니다.

이것은 사람이 만든 오류 일 뿐이지 만 동일한 문제가있는 사람에게는 도움이 될 수 있습니다.

0

데이터 세트에 뷰에 표시 할 레코드가 하나 이상있는 경우 getView() 메소드가 호출 중입니다.

getView() : 지정된 위치에있는 데이터에 해당하는 View.

그리고 데이터 세트의 크기에 따라서 0이면, 위치의 getView() 메소드를 호출하지 않은 결과도 0

이다.

0

나는이 문제가 있었고 나의 경우에는 문제가 내가 실수로 2 개의 어댑터를 생성했다는 것이었다. 그 중 하나는 setAdapter으로 전달되었고 다른 하나는 add을 사용하여 항목을 추가하는 데 사용되었습니다. 따라서 중요한 어댑터는 절대 추가되지 않았습니다.

2

ArrayAdapter 코드를 읽음으로써이 문제를 깨끗하게 해결했습니다. 분명히 객체의 내부 목록에 대한 참조를 유지합니다. 내가해야 할 일을했을 모든 따라서 슈퍼 생성자에 내 ArrayList의 포인터를 통과했다 :

public FriendsAdapter(Context context, int resource, ArrayList<FriendItem> friends) { 
    super(context, resource, friends); 
} 

와 나는 어떤 getItem 또는 getCount 메소드를 오버라이드 (override) 할 필요가 없었다.

참고 : 이것은 ArrayAdapter 및 API 레벨 23 이상을위한 것이며 적용되지 않을 수도 있습니다.

관련 문제