2017-10-30 16 views
0

Google의 제안 사항을 보여주는 AutoCompleteTextView를 만들려고하지만 제목과 같습니다. 전체 ArrayList가 개별적인 제안 대신 제안으로 표시됩니다.AutoCompleteTextView 별도의 문자열 대신 전체 ArrayList를 표시하는 사용자 지정 ArrayAdapter

개별 문자열을 어떻게 표시합니까? 어댑터에 잘못 추가하고 있습니까?

은 여기에 다른 사람들이 같은 일에 문제가 있었다하지만 난 아무것도 관련을 찾을 수 있는지 확인하기 위해 검색을 몇 가지했다

class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable { 
private ArrayList<String> data; 
private static final String BASE_URL = "http://suggestqueries.google.com/complete/search?"; 
private static final String CLIENT = "client=firefox"; // firefox = JSON | toolbar = toolbar 
private static final String SEARCH_URL = BASE_URL + CLIENT + "&q="; 
private final static String UTF8 = "UTF-8"; 

AutoCompleteAdapter(@NonNull Context context, @LayoutRes int resource) { 
    super(context, resource); 
    this.data = new ArrayList<>(); 
} 

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

@Nullable 
@Override 
public String getItem(int index) { 
    return data.get(index); 
} 

@NonNull 
@Override 
public Filter getFilter() { 
    return new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      if (constraint != null) { 
       HttpURLConnection conn = null; 
       InputStream input = null; 
       try { 
        URL url = new URL(SEARCH_URL + constraint.toString()); 
        conn = (HttpURLConnection) url.openConnection(); 
        input = conn.getInputStream(); 
        InputStreamReader reader = new InputStreamReader(input, UTF8); 
        BufferedReader buffer = new BufferedReader(reader, 8192); 
        StringBuilder builder = new StringBuilder(); 
        String line; 
        while ((line = buffer.readLine()) != null) { 
         builder.append(line); 
        } 
        JSONArray terms = new JSONArray(builder.toString()); 
        ArrayList<String> suggestions = new ArrayList<>(); 
        for (int i = 0; i < terms.length(); i++) { 
         String term = terms.getString(i); 
         suggestions.add(term); 
        } 
        results.values = suggestions; 
        results.count = suggestions.size(); 
        data = suggestions; 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } finally { 
        if (input != null) { 
         try { 
          input.close(); 
         } catch (Exception ex) { 
          ex.printStackTrace(); 
         } 
        } 
        if (conn != null) conn.disconnect(); 
       } 
      } 
      return results; 
     } 

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

}

ArrayAdapter와 내 사용자 정의입니다.

나는 여러 해 동안 내 머리카락을 풀어 왔습니다. 미리 감사드립니다.

답변

1

그것은 당신이되어보고 있다는 응답처럼 보인다 "[SEARCH_TERM, [결과 1, result2 ...]]"당신은 당신이 길이 두 가지의 배열 받고 파싱 이렇게하면 "[SEARCH_TERM을, everything_else] "라고 표시합니다. 다음은 "everything_else"를 구문 분석합니다. 추가 오류 검사를 수행해야 할 수도 있으므로 시작 지점으로 사용하는 것이 좋습니다.

JSONArray terms = new JSONArray(builder.toString()); 
    terms = new JSONArray(terms.get(1).toString()); 
0
 please check this parsing... 
     JSONArray terms = new JSONArray(builder.toString()); 
       ArrayList<String> suggestions = new ArrayList<>(); 
       for (int i = 0; i < terms.length(); i++) { 
        String term = terms.getString(i); 
        suggestions.add(term); 
       }