2013-04-27 10 views
10

नहीं है मेरे पास कस्टम एडाप्टरListFragment के साथ है लेकिन एडाप्टर 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

'@ ओवरराइड सार्वजनिक int getCount() { वापसी list.size(); } '। प्रश्न पूछने से पहले कृपया Google का प्रयोग करें। – Luksprog

+0

@Luksprog bro यह काम नहीं कर रहा है हालांकि – Akilan

+2

जैसा कि लुक्सप्रोग ने कहा था, आपको प्राप्त करने के लिए कुछ जोड़ने की आवश्यकता है। यह किसी भी विचार को आजमाने और बनाने के लिए नहीं जा रहा है अगर आपको लगता है कि आप 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 नहीं है?

कभी निर्माता में एक टुकड़ा के लिए किसी भी डेटा पास नहीं है सुनिश्चित करें कि आप एक्सएमएल

<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 या Serializable करना है।

आपको तर्क निर्दिष्ट करना होगा क्योंकि सिस्टम द्वारा फ्रैगमेंट को मार दिया जा सकता है और बहाल किया जा सकता है और यदि आप सेटर्स या कन्स्ट्रक्टर के माध्यम से डेटा पास करते हैं तो उन्हें पुनर्स्थापित नहीं किया जाएगा और इसलिए कुछ परिस्थितियों में शून्य हो सकती है।

+0

बहुत बहुत धन्यवाद .. :) सबक सीखा गलतियों के रास्ते में होता है ..: पी – Akilan

0

मुझे एक ही समस्या है, मेरे मामले में मैंने अपने Fragment कन्स्ट्रक्टर में अपनी स्थानीय सरणी सूची शुरू नहीं की है।

ArrayList<Image> mImageList; 

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

    mImageList = itemList; 
} 

मुझे 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+ के लिए है, इसलिए यह आपके लिए लागू नहीं हो सकता है।

संबंधित मुद्दे