Android 列表视图刷新

Posted

技术标签:

【中文标题】Android 列表视图刷新【英文标题】:Android List view refresh 【发布时间】:2011-05-04 14:00:04 【问题描述】:

我有一个 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;
  

【问题讨论】:

【参考方案1】:

我没有notifyDataSetChanged() 方法(android 2.3)。

以下对我有用:

getListView().invalidate();

就我而言,我已经更改了整个适配器,但它仍然没有刷新,所以对我来说,上述方法是唯一可行的解​​决方案。

【讨论】:

【参考方案2】:

为我刷新列表:listView.invalidateViews();

会做的:

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

管理某些列表项删除或一次删除所有元素的情况。

在 API 24 中测试。

【讨论】:

【参考方案3】:
    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;


【讨论】:

您需要 invalidate() 您的列表。在我的情况下,我 invalidate() 列表,用空元素初始化列表,然后重新初始化我的列表【参考方案4】:

您必须通知您的 ListView 适配器数据已更改。

listViewAdapater.notifyDataSetChanged();

如果由于某种原因这不起作用并且在某些奇怪的情况下它似乎没有通知,您可以通过构造函数使用更新后的数组重新分配您的适配器。

【讨论】:

我需要把这条线放在哪里? 就在 stockname.remove(post-1); listViewAdapter 只是一个示例,您必须将其替换为您调用的适配器。如果您无法访问它,只需将其设为该类的全局变量即可。 尝试重新初始化适配器,就像您在创建适配器时所做的那样。 兄弟们好!我知道上帝的解决方案应该是 notifyDataSetChaned(),但我没有t worked for me. I was made a list with up and down arrow for each element. If the user push the button two item shall swap with each other. So the method what you are suggesting isnt 为我工作,我不得不重置适配器: lw.setAdapter(mAdapter) 。谢谢:来自匈牙利的卡罗利 @blindstuff 重新初始化适配器会消耗大量资源和垃圾收集,不建议这样做【参考方案5】:

试试 getListView().refreshDrawableState

【讨论】:

以上是关于Android 列表视图刷新的主要内容,如果未能解决你的问题,请参考以下文章

在选项卡中的列表视图中刷新活动 (Android)

如何在android中使用baseadapter刷新自定义列表视图

如何在刷新表视图之前获取视图模型中的存储库列表?

知道如何防止 Android Widget 中显示的列表视图在每次刷新数据时闪烁吗?

片段中的Android ListView - 获取新数据后刷新表的问题

收到消息时无法刷新列表视图