android - ListView 不更新 onNotifyDataSetChanged()

标签 android listview

在我的应用程序中,这是我的 Activity 。在计时器内,我正在更新 ListView 。即使在使用 notifyDataSetChanged() 方法后,我的 ListView 也没有更新。

protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nodes);
        mListView = (ListView)findViewById(R.id.node_list);
        mNodes = new ArrayList<String>();
        mSentStatus = new ArrayList<String>();
        mRecvStatus = new ArrayList<String>();
        doTimerTask();
        mNodeList = new NodeListViewCustomAdapter(getParent(), mNodes, mSentStatus, mRecvStatus);
        mListView.setAdapter(mNodeList);
        mListView.setOnItemClickListener(this);
    }
    private void doTimerTask() {
        mTimer = new Timer();
        mTimer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {

                runOnUiThread(new Runnable() {
                    public void run() {
                        mNodes = getNodeListfromPeard();
                        mSentStatus = getSentStatusFromPeard();
                        mRecvStatus = getRecvStatusFromPeard();
                        mNodeList.notifyDataSetChanged();
                    }
                });
            }
        }, delay, period);

    }
    protected ArrayList<String> getRecvStatusFromPeard() {

        ArrayList<String> recvStatusList =  new ArrayList<String>();
        recvStatusList.add("|");
        recvStatusList.add("||");
        return recvStatusList;
    }
    protected ArrayList<String> getSentStatusFromPeard() {
        ArrayList<String> sentStatusList = new ArrayList<String>();
        sentStatusList.add("|");
        sentStatusList.add("||");
        return sentStatusList;
    }
    protected ArrayList<String> getNodeListfromPeard() {

     ArrayList<String> nodeList = new ArrayList<String>();
     nodeList.add("node1");
     nodeList.add("node2");
        return nodeList;
    }


public class NodeListViewCustomAdapter extends BaseAdapter {
    LayoutInflater inflater;
    private ArrayList<String> mNodeTitle;
    Activity mActivity;
    private ArrayList<String> mSentStatus;
    private ArrayList<String> mRecvStatus;

    public NodeListViewCustomAdapter(Activity aContext,ArrayList<String> aTitle,ArrayList<String> sentStatus,ArrayList<String> recvStatus ){
        super();
        mActivity = aContext;
        this.mNodeTitle = aTitle;
        this.mSentStatus = sentStatus;
        this.mRecvStatus = recvStatus;
        this.inflater = (LayoutInflater)aContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

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

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    public static class ViewHolder
    {
        TextView txtViewnodeTitle;
        TextView sentStatustxtView;
        TextView recvStatustxtView;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView==null)
        {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.nodelistitem_row, null);

            holder.txtViewnodeTitle = (TextView) convertView.findViewById(R.id.txtViewnodeTitle);
            holder.sentStatustxtView = (TextView) convertView.findViewById(R.id.sentstatustxtView);
            holder.recvStatustxtView = (TextView) convertView.findViewById(R.id.recvstatustextView);
            convertView.setTag(holder);
        }
        else{
            holder=(ViewHolder)convertView.getTag();
        }

        holder.txtViewnodeTitle.setText(mNodeTitle.get(position));
        holder.sentStatustxtView.setText(mSentStatus.get(position));
        holder.recvStatustxtView.setText(mRecvStatus.get(position));

        return convertView;
    }

}

但是当我在数组列表中一个一个地添加然后它的更新时。请帮助我

最佳答案

如下所示更改您的 runOnUiThread

     runOnUiThread(new Runnable() {
                        public void run() {
                            mNodes = getNodeListfromPeard();
                            mSentStatus = getSentStatusFromPeard();
                            mRecvStatus = getRecvStatusFromPeard();
                            mNodeList = new NodeListViewCustomAdapter(getParent(), mNodes, mSentStatus, mRecvStatus);
mListView.setAdapter(mNodeList);
                        }
                    });

覆盖适配器中的 notifyDatasetChanged 方法

public void notifyDatasetChanged(){

        this.mNodeTitle = ActivityName.this.mNodes;
        this.mSentStatus = ActivityName.this.mSentStatus;
        this.mRecvStatus = ActivityName.this.mRecvStatus;
        super.notifyDatasetChanged(); 

    }

关于android - ListView 不更新 onNotifyDataSetChanged(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14052257/

相关文章:

java - Android Switch 语句调试

Android Studio 不会将 Nexus 7 识别为设备

android - Android中ListView的分页

java - 同时滚动 2 个 ListView

android - 为在 android 中以编程方式添加的 ListView 设置动态高度

android - 以编程方式 "swipe-to-dismiss"ListView/RecyclerView 中的项目?

android - 在 iOS 和 Android 上唯一标识 Beacon

安卓开发 : Share animated Gif from Internal Storage

java - 套接字上的 JSON - 这是个好主意吗?

用于 ListView 的 JavaFX 平滑滚动