2013-09-22 5 views
0

У меня есть собственный адаптер, который простирается от BaseAdapter ..ListView не показывает обновленное содержание

Пользовательский код адаптера:

public class SearchListViewAdapter extends BaseAdapter { 

    private LayoutInflater layoutInflater; 
    private JsonArray searchResults; 

    public SearchListViewAdapter(Context context, JsonArray searchResults) { 
     this.searchResults = searchResults; 
     layoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return searchResults.count(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return searchResults.get(position); 
    } 

    /*public ListAdapter updateResults(JsonArray results) { 
     searchResults = results; 
     notifyDataSetChanged(); 
     return null; 
    }*/ 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     JsonObject searchResult = (JsonObject)getItem (position); 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.custom_search_result, null); 
      holder = new ViewHolder(); 
      holder.txtFullName = (TextView) convertView.findViewById(R.id.FullName); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.txtFullName.setText(searchResult.getString ("FirstName") + searchResult.getString ("LastName")); 

     return convertView; 
    } 

    static class ViewHolder { 
     TextView txtFullName; 
    } 
} 

код активность:

// After displaying the list in an onPostExecute Method of an AsyncTask class 
// I call another async task : BarcodeAction by giving the param : records 
new BarcodeAction(records).execute(""); 

private class BarcodeAction extends AsyncTask<String, Void, JsonArray> { 

    private JsonArray records; 

    public BarcodeAction(JsonArray result) 
    { 
     this.records = result; 
    } 

    @Override 
    protected JsonArray doInBackground(String... params) { 

     // Processing... if it's success the onPostExecute method receive : records 
     if (resultType.equals("success")) 
      return records; 

     return null; 
    } 

    @Override 
    protected void onPostExecute(final JsonArray records) { 
     final ListView lv1 = (ListView) findViewById(R.id.ListViewSearchResults); 

     // EDIT : notifyDataSetChange doesn't work 
     SearchListViewAdapter svla1 = new SearchListViewAdapter(SearchActivity.this, records); 
     lv1.setAdapter(svla1); 
     svla1.notifyDataSetChanged(); 


     lv1.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
       Object o = lv1.getItemAtPosition(position); 
       JsonObject response = (JsonObject)o; 

       SearchActivity.VISITOR_BARCODE = response.getString("Barcode"); 

       new BarcodeAction(records).execute(""); 
      } 
     }); 
    } 
} 

Но мой список не получает обновилась ..

У вас есть какие-либо идеи по этому поводу? Тнак ты.

+0

где определяется 'resultType'? – Emmanuel

+0

@Emmanuel спасибо. Я только что отказался от кода, потому что, чтобы сократить пост, это результат вызова REST Api ... и 'return records' определенно работает – Copernic

ответ

0

getItemId() должен возвращать уникальное значение для каждой записи в списке. Попробуйте вернуться только к позиции.

+0

Спасибо. Извините, я не понимаю вашу точку зрения. – Copernic

+0

@Override public long getItemId (int position) { return position; // Изменить 0 -> позиция } –

+0

Извините, но это не моя проблема. – Copernic

0

Я думаю, что основной причиной является отсутствует звонок notifyDataSetChanged() способ.

Фактически, ваш «код операции» - это не просто активность, а афнактоза, которая извлекает данные. Более распространенный способ использования adaper - иметь Adaper в вашей активности вместе с ListView. В вашем методе получения данных (asynctask или loader) вызовите изменение адаптера под базовым интерфейсом данных для изменения данных и вызовите метод notifyDataSetChanged() рекламодателя.

Немного psudeo-код может выглядеть так:

Adaper:

public class SearchListViewAdapter extends BaseAdapter { 
    private JsonArray searchResults; 

    ...... 

    public setDataSet(JsonArray newData) { 
     searchREsults = newData; 
    } 

    ...... 
} 

активность:

public class MyActivity extends Activity { 
    ListView mResultListView; 
    SearchListViewAdaper mResultViewAdaper; 

    @override 
    OnCreate(...) { 
      ...... 
     //init mResultListView 
     mResultListView = (ListView) findViewById(R.id.xxxx); 
     mResultViewAdaper = new SearchListViewAdapter(); 
     mResultListView.setAdapter(mResultViewAdaper); 
     ...... 
    } 
    ...... 
} 

AsyncTask: общественного fetchDataTask расширяет AsyncTask { ......

onPostExecute(JsonArray records) { 
     mResultViewAdaper.setDataSet(records); 
     // IMPORTANT: notify data change 
     mResultViewAdaper.notifyDataSetChanged(); 
} 
+0

спасибо. Но это не сработало. Я обновил свой код, добавив 'notifyDataSetChanged()' и все еще ничего ... – Copernic

+0

Я просто сделал почти то, что вы сделали в более простой версии, и это сработало для меня. Проверьте код на [здесь] (https://github.com/demote/androidTest). Если вы заметите что-нибудь странное, сообщите мне. Пожелайте, что это помогает. –

+0

Спасибо. Да, он должен работать, но он освежает. Я не вижу, где есть обновление списка и 'notifyDataSetChanged' .. Я ошибаюсь? – Copernic

Смежные вопросы