Обновление списка просмотра Android

У меня есть один ListView, который показывает мне некоторые данные через массив (который находится в другом классе, и я обращаюсь к нему через его объект).

Всякий раз, когда я удаляю элемент из контекстного меню ListView, список не обновляется, но элемент удаляется из массива. Как обновить список, чтобы показать это?

Код:

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { if (v.getId()==R.id.mainListView) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; post=info.position; menu.setHeaderTitle(stocks[info.position]); String[] menuItems = stt; for (int i = 0; i<menuItems.length; i++) { menu.add(Menu.NONE, i, i, menuItems[i]); } } } @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); int menuItemIndex = item.getItemId(); String[] menuItems = stt; String menuItemName = menuItems[menuItemIndex]; listItemName = stocks[info.position]; stockname.remove(post-1); return true; } 

Solutions Collecting From Web of "Обновление списка просмотра Android"

Вы должны уведомить адаптер ListView о том, что данные были изменены.

 listViewAdapater.notifyDataSetChanged(); 

Если это по какой-то причине не работает, и есть некоторые странные ситуации, когда кажется, что он не уведомлял, вы можете просто переназначить свой адаптер через конструктор с обновленным массивом.

У меня нет notifyDataSetChanged() (Android 2.3).

Следующие работали для меня:

 getListView().invalidate(); 

В моем случае я изменил весь адаптер, и он все еще не обновился, поэтому для меня описанный выше метод является единственным рабочим решением.

Попробуйте getListView (). refreshDrawableState

  private static ArrayList<Radio> m_streamsList; final ListView listView = (ListView) rootView.findViewById(R.id.stream_listRS); //my class where i insert data into my array m_myDBHelp = new DBHelper(); m_streamsList = m_myDBHelp.selectStreamsList(); // my list adapter - this is a class created by me RadioAdapter adapt = new RadioAdapter(context, m_streamsList); listView.setAdapter(adapt); ////////////------------- so . when i inserted a row in db, i need to refresh the list m_myDBHelp.insertStreamIntoDB(String name, String url); /// in my case method invalidate works fine listView.invalidate(); m_streamsList = null; m_streamsList = m_myDBHelp.selectStreamsList(); //you need to set adapter again RadioAdapter adapt2 = new RadioAdapter(context, m_streamsList); listView.setAdapter(adapt2); import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.example.npopa.musicplayern.R; import com.example.npopa.musicplayern.Radio; import java.util.ArrayList; public class RadioAdapter extends BaseAdapter{ private ArrayList<Radio> m_streams; private LayoutInflater m_stramInf; public RadioAdapter(Context c, ArrayList<Radio> theStreams){ m_streams = theStreams; m_stramInf = LayoutInflater.from(c); } @Override public int getCount() { return m_streams.size(); } @Override public Object getItem(int arg0) { return null; } @Override public long getItemId(int arg0) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { //map to radio_s layout LinearLayout streamLay = (LinearLayout) m_stramInf.inflate(R.layout.all_songs_t, parent, false); TextView name = (TextView) streamLay.findViewById(R.id.song_title); TextView url = (TextView) streamLay.findViewById(R.id.song_artist); ImageView imgALb = (ImageView) streamLay.findViewById(R.id.albumicon); //get all_songs_t using position Radio currStream = m_streams.get(position); name.setText(currStream.getName()); url.setText(currStream.getUrl()); imgALb.setImageResource(R.drawable.radio_stream); //set position as tag streamLay.setTag(position); return streamLay; } 

}

 public class Radio { private int id; private String name; private String url; public Radio(int id, String name, String url) { this.id = id; this.name = name; this.url = url; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } 

Список обновления для меня: listView.invalidateViews();

Так сойдет:

 mDataChanged = true; rememberSyncState(); requestLayout(); invalidate(); 

Случай, связанный с удалением или удалением всего элемента элемента сразу.

Протестировано в API 24.