2013-03-04 10 views
8

मैं एंड्रॉइड पर नौसिखिया हूं।कस्टम एडाप्टर फ़िल्टरिंग IndexOutOfBoundsException

फ़िल्टरिंग के दौरान मेरा कस्टम एडाप्टर अपवाद का कारण बनता है।

यहां मेरा कोड है। निजी वर्ग DeptAdapter फैली ArrayAdapter लागू करता फिल्टर {

private ArrayList<Dept> items; 
    private ArrayList<Dept> mOriginalValues; 

    public DeptAdapter(Context context, int textViewResourceId, ArrayList<Dept> items) { 
      super(context, textViewResourceId, items); 
      this.items = items; 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 

     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.item_listview_2line, null); 
     } 
     Dept d = items.get(position); 
     if (d != null) { 
       TextView tt = (TextView) v.findViewById(R.id.toptext); 
       TextView bt = (TextView) v.findViewById(R.id.bottomtext); 
       if (tt != null){ 
        tt.setText(d.dept_nm);        
       } 
       if(bt != null){ 
        bt.setText(d.dept_cd); 
       } 
     } 
     return v; 
    } 

    @Override 
    public Filter getFilter() { 
     Filter filter = new Filter() { 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint,FilterResults results) { 

       items = (ArrayList<Dept>) results.values; // has the filtered values 
       if (results.count > 0) { 
        notifyDataSetChanged(); 
       } else { 
        notifyDataSetInvalidated(); 
       } 
      } 

      } 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults results = new FilterResults();  // Holds the results of a filtering operation in values 
       ArrayList<Dept> FilteredArrList = new ArrayList<Dept>(); 

       if (mOriginalValues == null) { 
        mOriginalValues = new ArrayList<Dept>(items); // saves the original data in mOriginalValues 
       } 

       if (constraint == null || constraint.length() == 0) { 

        // set the Original result to return 
        results.count = mOriginalValues.size(); 
        results.values = mOriginalValues; 
       } else { 
        constraint = constraint.toString().toLowerCase(); 
        for (int i = 0; i < mOriginalValues.size(); i++) { 
         Dept d = mOriginalValues.get(i); 
         if (d.dept_cd.toLowerCase().startsWith(constraint.toString()) || d.dept_nm.toLowerCase().startsWith(constraint.toString())) { 
          FilteredArrList.add(d); 
         } 
        } 
        // set the Filtered result to return 
        results.count = FilteredArrList.size(); 
        results.values = FilteredArrList; 
       } 
       return results; 
      } 
     }; 
     return filter; 
    } 
} 

class Dept 
{ 
    String dept_cd; 
    String dept_nm; 
    public Dept(String dept_cd, String dept_nm) 
    { 
     this.dept_cd = dept_cd; 
     this.dept_nm = dept_nm; 
    } 
    public String toString() 
    { 
     return this.dept_nm+ "(" + this.dept_cd +")" ; 
    } 
} 

मुझे मदद किसी को भी .... मैं नहीं समझ सकता क्यों getView() विधि तो items.size()

+0

कृपया मैं भी दो तरीकों में से कोड चाहते getCount() और GetItem (पूर्णांक स्थिति DeptAdapter वर्ग और logcat उत्पादन –

+1

की पूरी कोड जोड़) –

उत्तर

16

ध्यान रखें और अधिक लागू किया गया था कि getView() आइटम superclass है, जो अभी के आकार क्वेरी करेगा, क्या आप मूल रूप इसे पारित जब, सुपर क्लास निर्माता बुला है

super(context, textViewResourceId, items); 

इसलिए, सुपरक्लास को पता नहीं है कि आपने फ़िल्टर किए जाने पर आकार बदल दिया है। इसका मतलब है getCount() सरणी के मूल आकार को वापस कर देगा, जो आपके फ़िल्टर किए गए सरणी से समझ में बड़ा है।

इसका मतलब यह है आप getCount() विधि ओवरराइड करना चाहिए ताकि आप सुनिश्चित करें कि आप वास्तविक मान्य आकार लौट रहे हैं कर रहे हैं:

@Override 
public int getCount() 
{ 
    return items.size(); 
} 

आप भी इस तरह के हो रही है के रूप में सूची के संचालन से संबंधित अन्य विधियों (ओवरराइड करना चाहिए) यदि आप उनका उपयोग करने जा रहे हैं। उदाहरण के लिए:

@Override 
public Dept getItem (int pos){ 
    return items.get(pos); 
} 
+1

बहुत बहुत धन्यवाद !! आपका जवाब पूरी तरह से मेरी समस्या हल हो गया था। – user1788012

+1

मेरा पूरा दिन बचाया – Nabin

+1

मुझे एक ही समस्या है और आपके समाधान ने भी मेरे लिए काम किया है। धन्यवाद! – user2151486

0

आप इस demo

पर getCount() विधि, नज़र याद कर रहे हैं मुझे आशा है कि यह उपयोगी हो जाएगा!

0
private ArrayList<Dept> items; 
    private ArrayList<Dept> mOriginalValues; 

    public DeptAdapter(Context context, int textViewResourceId, ArrayList<Dept> items) { 
      super(context, textViewResourceId, items); 
      this.items = items; 
      this.mOriginalValues=items; //add this line in your code 
    } 
+0

'mOriginalValues' एक प्लेसहोल्डर है जबकि फ़िल्टरिंग जगह पर है। इसे शुरुआत से वस्तुओं को पकड़ने की आवश्यकता नहीं है। –

+0

यदि (mOriginalValues ​​== null) {mOriginalValues ​​= new ArrayList (आइटम); // mioriginalValues ​​में मूल डेटा सहेजता है} आप यहां पहले उपयोग करते हैं और फिर ब्रो @ ए - सी – QuokMoon

+0

प्रारंभ करते हैं, यदि यह शून्य है, तो यह प्रारंभ होता है, और यही वह जगह है जहां आप एक प्रति सहेजते हैं। कन्स्ट्रक्टर में असाइन करना एक अच्छा असफल-सुरक्षित है, लेकिन जब आप किसी कारण से फ़िल्टर करते हैं तो 'शून्य' चेक पहले से मौजूद है। 'this.mOriginalValues ​​= आइटम; कन्स्ट्रक्टर में 'की आवश्यकता नहीं है। –

1

आप बेहतर प्रदर्शन के लिए इस तरीकों जोड़ने की जरूरत:

 @Override 
     public int getCount() { 
      return items.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return this.items.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 
संबंधित मुद्दे