不调用自定义适配器getview

不调用自定义适配器getview

问题描述:

我有一个自定义适配器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(); }'。请在提问前使用谷歌。 – Luksprog 2013-04-27 09:11:06

+0

@Luksprog兄弟不工作,虽然 – Akilan 2013-04-27 09:13:02

+2

正如Luksprog所说,你需要添加一些getCount。如果它认为您想要0,则不会尝试创建任何视图。 – alex 2013-04-27 09:16:00

这是因为getCount()返回零。 您在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" 
    ... 

另外,不要任何数据永远传递给片段构造。

WRONG

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

RIGHT

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或序列化。

您必须指定ARGS因为碎片会被杀死,由系统恢复,如果您通过制定者或构造函数传递数据,他们将无法恢复,因此可以成为在某些情况下空。

+0

非常感谢.. :)经验教训一路上发生错误..:P – Akilan 2013-04-27 09:30:10

我有同样的问题,在我的情况余did't我Fragment构造函数初始化我的本地数组列表。

ArrayList<Image> mImageList; 

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

    mImageList = itemList; 
} 

我错过了mImageList = itemList;部分。

这只是一个人为的错误,但它可能会有所帮助的人面临着同样的问题。当数据集具有至少一个记录在视图中显示

getView()方法正在呼叫。

getView():返回:与指定位置上的数据对应的视图。

如果我们的数据集的大小是0,因此,位置也为0

结果getView()方法被调用不。

我有这个问题,在我的情况下,问题是我错误地创建了2个适配器。其中之一我传递到setAdapter和另一个我正在使用添加项目使用add。所以重要的适配器永远不会被添加到。

我通过阅读ArrayAdapter代码干净地解决了这个问题。显然它保持对象的内部列表的引用。我所要做的就是给我的ArrayList指针传递给超构造这样的:

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

,我没有覆盖任何getItemgetCount方法。

注意:这是ArrayAdapter和API级别23+,因此它可能不适用于您。