2013-04-27 12 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()はゼロを返すからです。 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またはシリアル化を行う必要があります。

断片が殺され、復元されたシステムによって、あなたがセッターまたはコンストラクタを介してデータを渡す場合、彼らは復元されませんので、いくつかの状況ではnullになることができますすることができますので、あなたには、引数を指定する必要があります。

+0

ありがとうたくさんの:)教訓は道に沿って起こる間違いを学んだ..:P – Akilan

0

私は、私の場合、私は私のFragmentコンストラクタで私の地元の配列リストを初期化しdid't、同じ問題を抱えています。

ArrayList<Image> mImageList; 

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

    mImageList = itemList; 
} 

私はmImageList = itemList;の部分を見逃しました。

それが唯一の人工のエラーですが、それは同じ問題に直面して誰かに役に立つかもしれません。データセットは、ビューに表示する少なくとも1つのレコードを有する場合

0

getViewメソッド()メソッドを呼び出しています。

getViewメソッド():戻り値:指定された位置のデータに対応するビュー。

そして、我々は、データセットのサイズは、従って、0であれば、位置はgetViewメソッド()メソッドを呼び出していない結果も0

あります。

0

私はこの問題を抱えていましたが、私のケースでは、問題は私が間違って2つのアダプタを作成したことでした。そのうちの1つはsetAdapterに、もう1つはaddにアイテムを追加するために使用していました。したがって、重要なアダプタは決して追加されませんでした。

2

私はArrayAdapterコードを読んでこの問題をきれいに解決しました。明らかに、オブジェクトの内部リストへの参照を保持しています。

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

と私は、任意のgetItemまたはgetCountメソッドをオーバーライドする必要はありませんでした。私がしなければならなかったすべては、このようにスーパーコンストラクタに私のArrayListのポインタを渡すことでした。

注:これはArrayAdapterおよびAPIレベル23+のため、適用されない可能性があります。

関連する問題