2013-04-27 3 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 bro не работает, хотя – 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 идентификатор компоновщика не 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; 
} 

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 или Сериализуемый.

Необходимо указать аргументы, потому что фрагмент может быть убит и восстановлен системой, и если вы передадите данные через сеттеры или конструкторы, они не будут восстановлены и поэтому могут стать нулевыми при некоторых обстоятельствах.

+0

Большое спасибо .. :) Уроки, полученные в результате ошибок, происходят по пути ..: P – Akilan

0

У меня такая же проблема, в моем случае я не инициализировал свой локальный список массивов в моем конструкторе Fragment.

Я пропустил часть mImageList = itemList;.

Это только ошибка человека, но это может быть полезно для кого-то, стоящего перед той же проблемой.

0

Метод getView() вызывает, когда набор данных имеет хотя бы одну запись для отображения в представлении.

getView(): Возвращает: вид, соответствующий данным в указанной позиции.

И если размер набора данных 0, следовательно, положение также 0.

В результате метод GetView() не вызывает.

0

У меня была эта проблема, и в моем случае проблема заключалась в том, что я ошибочно создал 2 адаптера. Один из них я перешел к setAdapter, а другой, который я использовал, чтобы добавить элементы к использованию add. Так что адаптер, который имел значение, никогда не добавлялся.

2

Я решил эту проблему, читая код ArrayAdapter. По-видимому, он ссылается на внутренний список объектов. Все, что я должен был сделать, чтобы передать свой указатель ArrayList супер конструктор таким образом:

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

, и я не должен переопределять getItem или getCount методы.

Примечание: Это для ArrayAdapter и уровня API 23+, поэтому оно может не распространяться на вас.

Смежные вопросы