Reputation: 334
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
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
Reputation: 13405
Use this :
mNodeList = new NodeListViewCustomAdapter(getParent(), mNodes, mSentStatus, mRecvStatus);
mListView.setAdapter(mNodeList);
Instead of :
mNodeList.notifyDataSetChanged();
Thanks.
Upvotes: 0
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