1

У меня есть адаптер, который заполняет ListView с помощью 2 TextViews данными из TreeMap. Когда пользователь добавляет или удаляет данные из ListView, View должен быть обновлен.Android notifyDataSetChanged не работает

Так вот мой адаптер:

public class MyAdapter extends BaseAdapter { 
    private final ArrayList mData; 

    public MyAdapter(Map<String, String> map) { 
     mData = new ArrayList(); 
     mData.addAll(map.entrySet()); 
    } 

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

    @Override 
    public Map.Entry<String, String> getItem(int position) { 
     return (Map.Entry) mData.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO implement you own logic with ID 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final View result; 

     if (convertView == null) { 
      result = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_adapter_item, parent, false); 
     } else { 
      result = convertView; 
     } 
    Map.Entry<String, String> item = getItem(position); 

    // TODO replace findViewById by ViewHolder 
    ((TextView) result.findViewById(android.R.id.text1)).setText(item.getKey()); 
    ((TextView) result.findViewById(android.R.id.text2)).setText(item.getValue()); 

    return result; 
}} 

Потому что я хочу, чтобы обновить вид из диалога и на другой вопрос, который я прочитал, что notifyDataSetChanged() должен быть вызван из UIThread я кладу notifyDataSetChanged() в a Runnable. вот это:

Runnable run = new Runnable(){ 
     public void run(){ 
      Log.v("in the Runnable: ", String.valueOf(colorHashMap)); 
      adapter.notifyDataSetChanged(); 
     } 
    }; 

И это то, как Runnable вызывается в диалоге:

DefaultColorActivity.this.runOnUiThread(run); 

Но независимо от того, что я пытаюсь или сделать, список просто не будет обновляться. Мне нужно закрыть и снова открыть активность, чтобы получить новый список.

+2

где вы добавляете и удаляете данные из списка? –

ответ

2

создать метод в вашем adapter как:

public void updateList(){ 
    notifyDataSetChanged() 
} 

и вызвать этот метод, если вы хотите, чтобы обновить список

+0

это работало для меня вместе с 'clear()' и 'addAll()' – globus243

+0

@ globus243 рад, что сработал :) – hrskrs

0

Вызов метода notifyDataSetChanged() из класса Adapter (в методе getView()), который расширяет BaseAdapter после удаления элемента.

+0

не могли бы вы привести краткий пример, где добавить что? – globus243

+0

см. Этот пример, это то, что вы http://www.tutorialsbuzz.com/2014/09/android-listview-notifydatasetchange.html –

0

Прежде всего, вам необходимо внести изменения в карту (источник данных адаптера). И использовать Handler класс (Android OS Thread), чтобы запустить нить, как этот

Handler handler=new Handler(); 
    handler.post(run); 
0

Вы не можете создать объект списка.

просто создать ссылку и Asign список в список

удалить это заявление в вас адаптер класса

mData = новый ArrayList();

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