AndroidCrazy
AndroidCrazy

Reputation: 334

ListView not updating onNotifyDataSetChanged()

In my application this is my activity.Inside a timer I am updating the listview.My listview is not updating even after notifyDataSetChanged() method.

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;
    }

}

But when I add one by one in the arraylist then its updating.Please help me

Upvotes: 1

Views: 585

Answers (3)

Vishal Pawar
Vishal Pawar

Reputation: 4340

change your runOnUiThread as bellow

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

or

overide your notifyDatasetChanged method in adapter

public void notifyDatasetChanged(){

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

    }

Upvotes: 1

Pratik Sharma
Pratik Sharma

Reputation: 13405

Use this :

mNodeList = new NodeListViewCustomAdapter(getParent(), mNodes, mSentStatus, mRecvStatus);
mListView.setAdapter(mNodeList);

Instead of :

mNodeList.notifyDataSetChanged();

Thanks.

Upvotes: 0

Niranj Patel
Niranj Patel

Reputation: 33238

You are passing your data in constructor

 mNodeList = new NodeListViewCustomAdapter(getParent(), mNodes, mSentStatus, mRecvStatus);

If you will use mNodeList.notifyDataSetChanged(); then your data will be use which you already passed in constructor & data will not change, that why appear old data.

there are two way to refresh listview.

1)SetAdaper again instead of notidyDataSetChanged()

mNodeList = new NodeListViewCustomAdapter(getParent(), mNodes, mSentStatus, mRecvStatus);
mListView.setAdapter(mNodeList);

2)notidyDataSetChanged()

--Don't pass data in constructor

--Declare all global data & use that that for display in listview in NodeListViewCustomAdapter

--Update that global data & use notidyDataSetChanged()

Upvotes: 0

Related Questions