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();
}
}
}
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 ;