2013-03-22 2 views
0

Android가 처음이며 AutoCompleteTextView 및 다른 어댑터를 사용하여 실험하고 있습니다. ArrayAdapter (discussed here)로 작업하면 두 개의 AsyncTask 체인을 사용하여 동일한 작업을 시도하고 있습니다. 나는이 접근법의 몇 가지 예를 다른 곳에서 보았으며 스레드간에 데이터를 동기화하려고 시도하는 것보다 더 조숙하다고 생각한다. 또한 각 항목의 K, V 해시 맵을 유지할 수 있으므로이 애플리케이션의 다음 단계에 대한 제안을 클릭 할 때 항목 ID를 가져올 수 있기를 바랍니다.SimpleAdapter의 변경 사항에 응답하도록 AutoCompleteTextView 가져 오기

이 방법을 사용하면 다시보기가 제안 사항으로 업데이트됩니다. 내가 편집 상자에 입력 한 것과는 별개로 아무것도 나타나지 않습니다. UI 스레드와 AsyncTask 체인 사이의 타이밍 문제입니까? 또는 아마 내가 어댑터/뷰 바인딩의 실수입니까?

참고 : autoComplete.setAdapter (어댑터)로 이미 시도해 보았습니다. ParserTask onPostExecute() 메소드에 적용됩니다. 그것도 작동하지 않았다.

public class MainActivity extends Activity { 
    public String TAG = new String("MAINACTIVITY"); 
    public CustomAutoCompleteView autoComplete; 
    public InputStream inputStream; 
    private String serviceURL = new String("http://www.autocompare.co.uk/search.php?q="); 
    public QueryTask queryTask; 
    public ParserTask parserTask; 
    public SimpleAdapter adapter; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     autoComplete = (CustomAutoCompleteView) findViewById(R.id.autocomparesayt); 
     autoComplete.setHint(R.string.search_hint); 
     autoComplete.setThreshold(1); 
     autoComplete.setAdapter(adapter); 

     autoComplete.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(final CharSequence s, int start, int before, int count) { 
       int queryThreshold = 3; 
       if (s.length() != 2 && (s.length() - 1) % queryThreshold != 0) { 
        return; 
       } 

       queryTask = new QueryTask(); 
       queryTask.execute(s.toString()); 
      } 

      @Override 
      public void afterTextChanged(Editable s) { } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { } 
     }); 
    } 

    private class QueryTask extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... vehicle) { 
      // Go fetch data from webservice 
      // this bit works fine 
      return(data); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      Log.d(TAG, "now entered parser task"); 
      super.onPostExecute(result); 
      parserTask = new ParserTask(); 
      parserTask.execute(result); 
     } 
    } 

    private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String, String>>> { 
     @Override 
     protected List<HashMap<String, String>> doInBackground(String... jsonData) { 
      List<HashMap<String, String>> vehicles = null; 
      VehicleJSONParser vehicleJsonParser = new VehicleJSONParser(); 

      // parse JSON string and load data into vehicles 
      // this bit works fine too 

      return vehicles; 
     } 

     @Override 
     protected void onPostExecute(List<HashMap<String, String>> result) { 
      String[] from = {"name"}; 
      int[] to = new int[] { android.R.id.text1 }; 

      // Attempt to set up adapter with data bubbled up from parserTask execution 
      // THIS BIT LOGS NO ERRORS, BUT AUTOCOMPLETETEXTVIEW REMAINS UNCHANGED 
      adapter = new SimpleAdapter(getBaseContext(), result, android.R.layout.simple_list_item_1, 
      from, to); 
      adapter.notifyDataSetChanged(); 
     } 
    } 
} 
+0

일부 닫는 중괄호 앞에 줄 간격 - 내가 어떻게 멈출 지 알아낼 수 있다면! – planetguru

+0

정확한 접근법이'onPostExecute()'에서'autoComplete.setAdapter()'를 사용한다는 점을 제외하고는 모든 것이 정상적으로 보입니다. 커스텀'AutoCompleteTextView'를 만들었습니다. 아마 그 코드 내에 뭔가 잘못된 것이 있을까요? – Ole

+0

'onTextChanged()'의'if' 절은 무엇입니까? 또한 앞의 질문에서 drop을 트리거하기 위해'autoCompleteAdapter.getFilter(). filter (s, autoComplete);'를 호출했음을 기억하십시오. 어댑터를 설정하고 notifyDataSetChanged를 호출하면 어댑터가 표시되지 않습니다. – Luksprog

답변

1

확인은 - 믿을 들리지만, postExecute까지 다시는, setAdapter() 메소드를 이동과 장소에 notifyDataSetChanged()을 유지 경비정이 작동 보인다!

(다음 단계는 wheee .. AutoCompleteTextView에 클릭 이벤트가 아마 의도/번들/조각을 사용하여 파악하는 것입니다!) 여기에

최종 작업 코드 다음에 유래 코드 포매터는 괴팍스러운두고있다

public class MainActivity extends Activity { 
    public String TAG = new String("MAINACTIVITY"); 
    public CustomAutoCompleteView autoComplete; 
    public InputStream inputStream; 
    private String serviceURL = new String("http://www.blabla.co.uk/search.php?q="); 
    public QueryTask queryTask; 
    public ParserTask parserTask; 
    public SimpleAdapter adapter; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     autoComplete = (CustomAutoCompleteView) findViewById(R.id.autocomparesayt); 
     autoComplete.setHint(R.string.search_hint); 
     autoComplete.setThreshold(1); 

     autoComplete.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(final CharSequence s, int start, int before, int count) { 
       int queryThreshold = 3; 
       if (s.length() != 2 && (s.length() - 1) % queryThreshold != 0) { 
        return; 
       } 

       queryTask = new QueryTask(); 
       queryTask.execute(s.toString()); 
      } 

      @Override 
      public void afterTextChanged(Editable s) { } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { } 
     }); 
    } 

    private class QueryTask extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... vehicle) { 
      // Go fetch data from webservice 
      // this bit works fine 
      return(data); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      Log.d(TAG, "now entered parser task"); 
      super.onPostExecute(result); 
      parserTask = new ParserTask(); 
      parserTask.execute(result); 
     } 
    } 

    private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String, String>>> { 
     @Override 
     protected List<HashMap<String, String>> doInBackground(String... jsonData) { 
      List<HashMap<String, String>> vehicles = null; 
      VehicleJSONParser vehicleJsonParser = new VehicleJSONParser(); 

      // parse JSON string and load data into vehicles 
      // this bit works fine too 

      return vehicles; 
     } 

     @Override 
     protected void onPostExecute(List<HashMap<String, String>> result) { 
      String[] from = {"name"}; 
      int[] to = new int[] { android.R.id.text1 }; 

      adapter = new SimpleAdapter(getBaseContext(), result, android.R.layout.simple_list_item_1, 
      from, to); 
      autoComplete.setAdapter(adapter); 
      adapter.notifyDataSetChanged(); 
     } 
    } 
} 
관련 문제