2017-02-11 64 views
0

我是新來的機器人,並試圖做一個標記功能,當我鍵入@下拉列表將顯示(不寫後寫@後)..我在這裏看到類似類型的問題,但我沒有得到答案..請幫助我解決這個問題。我想彈出一個按下@的下拉列表。

MultiAutoCompleteTextView mt=(MultiAutoCompleteTextView) 
      findViewById(R.id.multiAutoCompleteTextView1); 

    mt.setTokenizer(new AtTokenizer()); 

    ArrayAdapter<String> adp=new ArrayAdapter<String>(this, 
      android.R.layout.simple_dropdown_item_1line,str); 

    mt.setThreshold(1); 
    mt.setAdapter(adp); 

    } 
public class AtTokenizer implements MultiAutoCompleteTextView.Tokenizer { 

    public int findTokenStart(CharSequence text, int cursor) { 

     int i = cursor; 
     while (i > 0 && text.charAt(i - 1) != '@') 
      i--; 
     while (i < cursor && text.charAt(i) == ' ') 
      i++; 
     return i; 

    } 


    public int findTokenEnd(CharSequence text, int cursor) { 

     int i = cursor; 
     int len = text.length(); 
      while (i < len) { 
       if (text.charAt(i) == '@') { 
        return i; 
       } else { 
        i++; 
       } 
      } 
     return len; 
    } 


    public CharSequence terminateToken(CharSequence text) { 
     int i = text.length(); 

     while (i > 0 && text.charAt(i - 1) == ' ') 
      i--; 
     if (i > 0 && text.charAt(i-1) == '@') { 
      return text; 
     } else { 
      if (text instanceof Spanned) { 
       SpannableString sp = new SpannableString(text); 
       TextUtils.copySpansFrom((Spanned) text, 0, text.length(), 
         Object.class, sp, 0); 
       return sp; 
      } 
      else { 
       return text; 
      } 
     } 

    } 

    } 

回答

0

我google'd而我得到的解決方案。我的代碼如下,其工作適用於我。我只是在Activity的onCreate()方法中設置了自動完成。

在我的情況下,我使用@字符來標識應該查找的文本塊的開始位置,並確定查找標記的結束位置。

public class MultiAutoCompleteTextViewDemo extends AppCompatActivity 
{ 
    MultiAutoCompleteTextView inputEditText; 

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

     inputEditText = (MultiAutoCompleteTextView) findViewById(R.id.multiAutoCompleteTextView1); 
     inputEditText.setTokenizer(new UsernameTokenizer()); 
     inputEditText.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       int cursor = start; 
       if (cursor >= s.length()) cursor = s.length()-1; 
       if (isValidToken(s, cursor)){ 
        String token = getToken(s, start); 
        new LinkedinSkillAsyncTask((Activity) getApplicationContext()).execute(token); 
       } 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 
    } 

    private boolean isValidToken(CharSequence text, int cursor){ 
     for (int i=cursor; i>=0; i--){ 
      if (text.charAt(i) == '@') return true; 
      if (text.charAt(i) == ' ') return false; 
     } 
     return false; 
    } 

    private String getToken(CharSequence text, int cursor){ 
     int start=findTokenStart(text, cursor); 
     int end=findTokenEnd(text, cursor); 
     return text.subSequence(start, end).toString(); 
    } 

    private int findTokenStart(CharSequence text, int cursor) { 
     int i = cursor; 
     while (i > 0 && text.charAt(i - 1) != '@') { i--; } 
     return i; 
    } 

    private int findTokenEnd(CharSequence text, int cursor) { 
     int i = cursor; 
     int len = text.length(); 
     while (i < len && text.charAt(i) != ' ' && text.charAt(i) != ',' && text.charAt(i) != '.' ) { 
      i++; 
     } 
     return i; 
    } 

    public class UsernameTokenizer implements MultiAutoCompleteTextView.Tokenizer { 

     @Override public CharSequence terminateToken(CharSequence text) { 
      int i = text.length(); 
      while (i > 0 && text.charAt(i - 1) == ' ') { i--; } 
      if (text instanceof Spanned) { 
       SpannableString sp = new SpannableString(text + " "); 
       TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0); 
       return sp; 
      } else { 
       return text + " "; 
      } 
     } 

     @Override public int findTokenStart(CharSequence text, int cursor) { 
      int i = cursor; 
      while (i > 0 && text.charAt(i - 1) != '@') { 
       i--; 
      } 

      if (i < 1 || text.charAt(i - 1) != '@') { 
       return cursor; 
      } 

      return i; 
     } 

     @Override public int findTokenEnd(CharSequence text, int cursor) { 
      int i = cursor; 
      int len = text.length(); 
      while (i < len) { 
       if (text.charAt(i) == ' ') { 
        return i; 
       } else { 
        i++; 
       } 
      } 
      return len; 
     } 

    } 

    public class LinkedinSkillAsyncTask extends AsyncTask<String, String, String> { 

     private Activity context; 
     public String data; 
     public List<String> suggest; 
     public ArrayAdapter<String> aAdapter; 

     public LinkedinSkillAsyncTask(Activity cntxt) { 
      context = cntxt; 
     } 


     @Override protected String doInBackground(String... key) { 
      String newText = key[0]; 
      newText = newText.trim(); 
      newText = newText.replace(" ", "+"); 
      try { 
       HttpClient hClient = new DefaultHttpClient(); 
       HttpGet hGet = new HttpGet("http://www.linkedin.com/ta/skill?query="+newText); 

       ResponseHandler<String> rHandler = new BasicResponseHandler(); 
       data = hClient.execute(hGet, rHandler); 
       suggest = new ArrayList<String>(); 
       JSONObject jobj = new JSONObject(data); 
       JSONArray jArray = jobj.getJSONArray("resultList"); 
       for (int i = 0; i < jArray.length(); i++) { 
        String SuggestKey = jArray.getJSONObject(i).getString("displayName"); 
        suggest.add(SuggestKey); 
       } 
      } catch (Exception e) { 
       Log.w("Error", e.getMessage()); 
      } 

      context.runOnUiThread(new Runnable() { 
       public void run() { 
        MultiAutoCompleteTextView inputEditText = (MultiAutoCompleteTextView) context.findViewById(R.id.multiAutoCompleteTextView1); 
        aAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_dropdown_item_1line, suggest); 
        inputEditText.setAdapter(aAdapter); 
        aAdapter.notifyDataSetChanged(); 
       } 
      }); 

      return null; 
     } 
    } 
} 

對於更多的細節,你可以read this tutorial。例如,檢查這個GitHub演示項目。

相關問題