8

मैं कठिनाई AutoCompleteTextView ऐसी त्रुटियों के लिए एक कस्टम ArrayAdapter बनाने कि इंटरनेट पर पाया होगा कोड निम्नलिखित के बावजूद आने जाए किया गया है के लिए कस्टम BaseAdapter बनाने के लिए कैसे:AutoCompleteTextView

  • ड्रापडाउन दिखाई नहीं देतीं।
  • कस्टम ऑब्जेक्ट्स और उनके विवरण प्रकट नहीं होंगे।

तो उन लोगों के लिए जो मेरे पास एक ही समस्या है या नहीं, मैं इसके बजाय AutoCompleteTextView के लिए बेसएडाप्टर का उपयोग करने की सलाह देता हूं।

+0

आपको वेब सेवा से डेटा कैसे प्राप्त हुआ? प्रेजिपीप्लॉकनेक्शन या ओकेट्प या वॉली द्वारा ...? उनमें से कुछ async हैं। – BNK

+0

मैं OkHttp का उपयोग करता हूं। मैं एक हैंडलर और एक रननेबल बनाता हूं, हैंडलर Looper.getMainLooper() से बनाया गया है; मैं इसे गतिविधि के क्रिएट() में शुरू करता हूं। –

उत्तर

39

निम्नलिखित मेरे कार्य ArrayAdapter का उपयोग कर कोड है।

की प्रतिक्रिया डेटा मान से वेब सेवा की तरह लग रहा हैं निम्नलिखित:

[ 
    { 
     "id": "1", 
     "name": "Information Technology" 
    }, 
    { 
     "id": "2", 
     "name": "Human Resources" 
    }, 
    { 
     "id": "3", 
     "name": "Marketing and PR" 
    }, 
    { 
     "id": "4", 
     "name": "Research and Developement" 
    } 
] 

फिर अपने Android ग्राहक में

:

विभाग वर्ग:

public class Department { 
    public int id; 
    public String name; 
} 

कस्टम एडाप्टर वर्ग:

public class DepartmentArrayAdapter extends ArrayAdapter<Department> { 
    private final Context mContext; 
    private final List<Department> mDepartments; 
    private final List<Department> mDepartmentsAll; 
    private final int mLayoutResourceId; 

    public DepartmentArrayAdapter(Context context, int resource, List<Department> departments) { 
     super(context, resource, departments); 
     this.mContext = context; 
     this.mLayoutResourceId = resource; 
     this.mDepartments = new ArrayList<>(departments); 
     this.mDepartmentsAll = new ArrayList<>(departments); 
    } 

    public int getCount() { 
     return mDepartments.size(); 
    } 

    public Department getItem(int position) { 
     return mDepartments.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     try { 
      if (convertView == null) {      
       LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 
       convertView = inflater.inflate(mLayoutResourceId, parent, false); 
      } 
      Department department = getItem(position); 
      TextView name = (TextView) convertView.findViewById(R.id.textView); 
      name.setText(department.name); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return convertView; 
    } 

    @Override 
    public Filter getFilter() { 
     return new Filter() { 
      @Override 
      public String convertResultToString(Object resultValue) { 
       return ((Department) resultValue).name; 
      } 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults filterResults = new FilterResults(); 
       List<Department> departmentsSuggestion = new ArrayList<>(); 
       if (constraint != null) { 
        for (Department department : mDepartmentsAll) { 
         if (department.name.toLowerCase().startsWith(constraint.toString().toLowerCase())) { 
          departmentsSuggestion.add(department); 
         } 
        } 
        filterResults.values = departmentsSuggestion; 
        filterResults.count = departmentsSuggestion.size(); 
       } 
       return filterResults; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       mDepartments.clear(); 
       if (results != null && results.count > 0) { 
        // avoids unchecked cast warning when using mDepartments.addAll((ArrayList<Department>) results.values); 
        for (Object object : (List<?>) results.values) { 
         if (object instanceof Department) { 
          mDepartments.add((Department) object); 
         } 
        } 
        notifyDataSetChanged(); 
       } else if (constraint == null) { 
        // no filter, add entire original list back in 
        mDepartments.addAll(mDepartmentsAll); 
        notifyDataSetInvalidated(); 
       } 
      } 
     }; 
    } 
} 

मुख्य गतिविधि:

BNK's screenshot

आशा इस मदद करता है:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView); 
    mAutoCompleteTextView.setThreshold(1); 

    new DepartmentRequest().execute(); 
} 

private class DepartmentRequest extends AsyncTask<Void, Void, JSONArray> { 
     @Override 
     protected JSONArray doInBackground(Void... voids) { 
      OkHttpJsonArrayRequest request = new OkHttpJsonArrayRequest(); 
      try { 
       return request.get("http://..."); 
      } catch (IOException | JSONException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(JSONArray jsonArray) { 
      super.onPostExecute(jsonArray); 
      if (jsonArray != null && jsonArray.length() > 0) { 
       Gson gson = new Gson(); 
       Department[] departments = gson.fromJson(jsonArray.toString(), Department[].class); 
       mDepartmentList = Arrays.asList(departments); 
       mDepartmentArrayAdapter = new DepartmentArrayAdapter(mContext, R.layout.simple_text_view, mDepartmentList); 
       mAutoCompleteTextView.setAdapter(mDepartmentArrayAdapter); 
      } 
     } 
    } 

    private class OkHttpJsonArrayRequest { 
     OkHttpClient client = new OkHttpClient(); 
     // HTTP GET REQUEST 
     JSONArray get(String url) throws IOException, JSONException { 
      Request request = new Request.Builder() 
        .url(url) 
        .build(); 
      Response response = client.newCall(request).execute(); 
      return new JSONArray(response.body().string()); 
     } 
    } 

यहाँ स्क्रीनशॉट है!

+1

बहुत अच्छा :) महान काम – Oreo

+1

धन्यवाद। आप वास्तव में मेरी मदद करें – farhad

+0

@BNK, multAutoCompleteTextView में इसे कार्यान्वित करने का प्रयास कर रहा था। आपके उदाहरण में, चार विभाग हैं। क्या होगा यदि उपयोगकर्ता चारों के अलावा किसी अन्य विभाग में टाइप करता है? क्या हम उपयोगकर्ता को उन चारों के अलावा किसी अन्य विभाग में प्रवेश करने से रोक सकते हैं? – tpk

20

कस्टम BaseAdapter कक्षा

public class ObjectAdapter extends BaseAdapter implements Filterable { 

    private Context context; 
    private ArrayList<Object> originalList; 
    private ArrayList<Object> suggestions = new ArrayList<>(); 
    private Filter filter = new CustomFilter(); 

    /** 
    * @param context  Context 
    * @param originalList Original list used to compare in constraints. 
    */ 
    public ObjectAdapter(Context context, ArrayList<Object> originalList) { 
     this.context = context; 
     this.originalList = originalList; 
    } 

    @Override 
    public int getCount() { 
     return suggestions.size(); // Return the size of the suggestions list. 
    } 

    @Override 
    public Object getItem(int position) { 
     return suggestions.get(position).getCountryName(); 
    } 


    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    /** 
    * This is where you inflate the layout and also where you set what you want to display. 
    * Here we also implement a View Holder in order to recycle the views. 
    */ 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(context); 

     ViewHolder holder; 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.adapter_autotext, 
        parent, 
        false); 
      holder = new ViewHolder(); 
      holder.autoText = (TextView) convertView.findViewById(R.id.autoText); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.autoText.setText(suggestions.get(position).getCountryName()); 

     return convertView; 
    } 


    @Override 
    public Filter getFilter() { 
     return filter; 
    } 

    private static class ViewHolder { 
     TextView autoText; 
    } 

    /** 
    * Our Custom Filter Class. 
    */ 
    private class CustomFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      suggestions.clear(); 

      if (originalList != null && constraint != null) { // Check if the Original List and Constraint aren't null. 
       for (int i = 0; i < originalList.size(); i++) { 
        if (originalList.get(i).getCountryName().toLowerCase().contains(constraint)) { // Compare item in original list if it contains constraints. 
         suggestions.add(originalList.get(i)); // If TRUE add item in Suggestions. 
        } 
       } 
      } 
      FilterResults results = new FilterResults(); // Create new Filter Results and return this to publishResults; 
      results.values = suggestions; 
      results.count = suggestions.size(); 

      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 
    } 
} 

मुख्य गतिविधि कक्षा

public class MainActivity extends AppCompatActivity{ 

    private SGetCountryListAdapter countryAdapter; 
    private ArrayList<SGetCountryList> countryList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     country = (AutoCompleteTextView) findViewById(R.id.country); 
     countryAdapter = new SGetCountryListAdapter(getApplicationContext(), 
        ConnectionParser.SGetCountryList); 

     country.setAdapter(countryAdapter); 
     country.setThreshold(1); 

    } 

} 

ड्रॉप डाउन लेआउट

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/autoText" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="8dp" 
     android:layout_marginEnd="16dp" 
     android:layout_marginLeft="16dp" 
     android:layout_marginRight="16dp" 
     android:layout_marginStart="16dp" 
     android:layout_marginTop="8dp" 
     android:textColor="@color/black" /> 

</LinearLayout> 

मेरे मूल सूची डेटा वेब सेवा से ले लिया है तो चलो चलो बस पहले से ही यह मान लेते हैं कि डेटा है बेशक आप अधिक विचार जोड़कर ड्रॉपडाउन को और भी कस्टमाइज़ कर सकते हैं, नए विचारों को शामिल करने के लिए एडाप्टर को अपडेट करना न भूलें।

+0

अच्छा जवाब। लेकिन यह डीडी से आइटम का चयन नहीं करता है और ऑटोकंपलेटटेक्स्ट व्यू पर सेट करता है। क्या आप इसके लिए समाधान प्रदान कर सकते हैं? – VVB

+0

yup मैं ड्रॉपडाउन किसी भी 1 समाधान से चुन नहीं सकता? –

+1

हालांकि मुझे एक और तरीका मिला है मैंने # holder.autoText.SetOn पर क्लिक किया है और फिर उस पर तर्क लागू करें और यह पूरी तरह से काम करता है –

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