splitwise / TokenAutoComplete

Gmail style MultiAutoCompleteTextView for Android
Apache License 2.0
1.3k stars 384 forks source link

onTokenAdded and onTokenRemoved method not called after token added and removed #292

Closed SachinTanpure closed 7 years ago

SachinTanpure commented 7 years ago

I am on android 7 i am using TokenCompleteTextView inside RecyclerView custom adapter

See my code

public class MyViewHolder extends RecyclerView.ViewHolder { public EditText txtLabel; public ContactsCompletionView multiAutoCompleteAdmin; public ProgressBar prgsMultiAutoComplete; public Button btnRemoveAdmins; public LinearLayout layDetails; public boolean isSetInitialText; public boolean isTyping = false; private HashMap<Integer, JSONObject> multiAutoCompleteTextViewMapping = new HashMap<>(); private String url ; private String method ; private JSONObject jsonObject ;

    public MyViewHolder(View convertView)
    {
        super(convertView);
        txtLabel = (EditText) convertView.findViewById(R.id.txtLabel);
        multiAutoCompleteAdmin = (ContactsCompletionView) convertView.findViewById(R.id.multiAutoCompleteAdmin);
        prgsMultiAutoComplete = (ProgressBar) convertView.findViewById(R.id.prgsMultiAutoComplete);
        btnRemoveAdmins = (Button) convertView.findViewById(R.id.btnRemoveAdmins);
        layDetails = (LinearLayout) convertView.findViewById(R.id.layDetails);

        txtLabel.addTextChangedListener(new TextWatcher() {
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            public void afterTextChanged(Editable editable) {
                if (isSetInitialText) {
                    isSetInitialText = false;
                } else {
                    if (editable.toString().trim().length() > 0) {
                        if (txtLabel.getTag() != null) {
                            int pos = (int) txtLabel.getTag();
                            FormAdminsModel formAdminsModel = formAdminsModels.get(pos);
                            formAdminsModel.setLabel(editable.toString());
                            formAdminsModels.set(pos, formAdminsModel);
                        }
                    }
                }
            }

            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }
        });

        multiAutoCompleteAdmin.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
        multiAutoCompleteAdmin.setTextSize(19);
        multiAutoCompleteAdmin.allowDuplicates(false);
        multiAutoCompleteAdmin.allowCollapse(false);
        try
        {

            /*******************************************************************************************/

            final int TYPING_TIMEOUT = 1000; // 1 second timeout
            final Handler timeoutHandler = new Handler();
            final Runnable typingTimeout = new Runnable()
            {
                public void run()
                {
                    isTyping = false;
                    prgsMultiAutoComplete.setVisibility(View.VISIBLE);
                    TwigmeAPI.fetch(context, url, method, jsonObject.toString(), true /*silent*/, new TwigmeAPI.IAPICallback()
                    {
                        @Override
                        public void success(TwigmeAPI.CallResult result)
                        {
                            try
                            {
                                List<SearchSuggestionModel> mList = new ArrayList<SearchSuggestionModel>();
                                AutoCompleteTextViewAdapter autoCompleteTextViewAdapter;

                                JSONObject outputJsonObject = new JSONObject(result.getResponseText());
                                JSONObject dataObject = outputJsonObject.getJSONObject("data");
                                JSONArray elements = dataObject.getJSONArray("elements");
                                for (int i = 0; i < elements.length(); i++)
                                {
                                    JSONObject row = elements.getJSONObject(i);
                                    String title = row.getString("title");
                                    String subTitle = row.getString("subtitle");
                                    String imgurl = row.getString("imgurl");
                                    String select = row.getString("select");
                                    String type = row.getString("type");
                                    SearchSuggestionModel searchSuggestionModel = new SearchSuggestionModel(title, subTitle, imgurl, select,type);
                                    mList.add(searchSuggestionModel);
                                }

                                if (multiAutoCompleteTextViewMapping.containsKey(multiAutoCompleteAdmin.getId()))
                                    multiAutoCompleteTextViewMapping.remove(multiAutoCompleteAdmin.getId());

                                multiAutoCompleteTextViewMapping.put(multiAutoCompleteAdmin.getId(), outputJsonObject);

                                autoCompleteTextViewAdapter = new AutoCompleteTextViewAdapter(context, android.R.layout.simple_dropdown_item_1line, android.R.id.text1, mList);
                                multiAutoCompleteAdmin.setAdapter(autoCompleteTextViewAdapter);
                                multiAutoCompleteAdmin.setTokenClickStyle(TokenCompleteTextView.TokenClickStyle.Select);
                                if (!multiAutoCompleteAdmin.isPopupShowing())
                                    multiAutoCompleteAdmin.showDropDown();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            prgsMultiAutoComplete.setVisibility(View.GONE);
                        }

                        @Override
                        public void failure(TwigmeAPI.CallResult result) {
                            prgsMultiAutoComplete.setVisibility(View.GONE);
                            Utils.showToast(context, "" + result.getFailureMessage());
                        }
                    });
                }
            };
            multiAutoCompleteAdmin.setTokenListener(new TokenCompleteTextView.TokenListener<SearchSuggestionModel>() {
                @Override
                public void onTokenAdded(SearchSuggestionModel token) {
                    UserAndUserGroupDetails userAndUserGroup=new  UserAndUserGroupDetails();
                    userAndUserGroup.setTitle(token.getTitle());
                    userAndUserGroup.setSubtitle(token.getSubtitle());
                    userAndUserGroup.setImgurl(token.getImgurl());
                    userAndUserGroup.setType(token.getType());
                    userAndUserGroup.setSelect(token.getSelect());

                    int pos=(int) multiAutoCompleteAdmin.getTag();
                    FormAdminsModel formAdminsModel= formAdminsModels.get(pos);
                    ArrayList<UserAndUserGroupDetails> userAndUserGroupDetails=formAdminsModel.getUserAndUserGroupDetails();
                    userAndUserGroupDetails.add(userAndUserGroup);
                    formAdminsModel.setUserAndUserGroupDetails(userAndUserGroupDetails);
                    formAdminsModels.set(pos,formAdminsModel);
                }

                @Override
                public void onTokenRemoved(SearchSuggestionModel token) {
                    int pos=(int) multiAutoCompleteAdmin.getTag();
                    FormAdminsModel formAdminsModel= formAdminsModels.get(pos);
                    ArrayList<UserAndUserGroupDetails> userAndUserGroupDetails=formAdminsModel.getUserAndUserGroupDetails();
                    userAndUserGroupDetails.remove(token);
                    formAdminsModel.setUserAndUserGroupDetails(userAndUserGroupDetails);
                    formAdminsModels.set(pos,formAdminsModel);
                }
            });

            multiAutoCompleteAdmin.setOnItemClickListener(new AdapterView.OnItemClickListener()
            {
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)
                {
                    timeoutHandler.removeCallbacks(typingTimeout);
                }
            });

            multiAutoCompleteAdmin.addTextChangedListener(new TextWatcher() {
                @Override
                public void afterTextChanged(Editable editable) {
                }

                @Override
                public void beforeTextChanged(CharSequence charSequence, int arg1, int arg2, int arg3) {
                }

                @Override
                public void onTextChanged(CharSequence charSequence, int start, int before, int count) {

                    String text = charSequence.toString();
                    timeoutHandler.removeCallbacks(typingTimeout);
                    if (text.trim().length() > 1) {
                        String searchtext1 = new StringBuilder(text).reverse().toString().trim();
                        String searchtext = null;
                        int commaindex = searchtext1.indexOf(",");
                        if (commaindex != -1) {
                            searchtext1 = searchtext1.substring(0, commaindex);
                        }
                        if (searchtext1.length() > 1) {
                            searchtext = new StringBuilder(searchtext1).reverse().toString().trim();
                        } else {
                            searchtext = searchtext1;
                        }
                        timeoutHandler.removeCallbacks(typingTimeout);
                        if (searchtext.trim().length() > 1) {
                            try
                            {
                                int pos = (int) multiAutoCompleteAdmin.getTag();

                                url = formAdminsModels.get(pos).getUrl();
                                method = formAdminsModels.get(pos).getMethod();
                                jsonObject = formAdminsModels.get(pos).getJsondata().trim().length() > 0 ? new JSONObject(formAdminsModels.get(pos).getJsondata()) : new JSONObject();
                                jsonObject.put("searchQuery", searchtext);
                                // schedule the timeout
                                timeoutHandler.postDelayed(typingTimeout, TYPING_TIMEOUT);
                                if (!isTyping) {
                                    isTyping = true;
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    } else {
                        multiAutoCompleteAdmin.setHint("");
                        isTyping = false;
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
SachinTanpure commented 7 years ago

i have solved this issue by adding multiAutoCompleteAdmin.setTokenListener at the end i.e after multiAutoCompleteAdmin.addTextChangedListener listener