Reputation:
I am having some problem when trying to refresh the list view in Android. This is my onCreate method:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.transaction_rec);
context = this;
listview = (ListView) findViewById(R.id.listview);
builtListView();
}
public void builtListView() {
DatabaseAdapter mDbHelper = new DatabaseAdapter(this);
mDbHelper.createDatabase();
mDbHelper.open();
TransactionRecController trc = new TransactionRecController(
mDbHelper.open());
ArrayList<TransactionRecModel> trans_list = trc
.getTransactionRec(session_userID);
for (int i = 0; i < trans_list.size(); i++) {
String date = trans_list.get(i).getDate();
String categoryName = trans_list.get(i).getCategory();
String transDesc = trans_list.get(i).getTransDescription();
TransactionRecModel _TransModel = new TransactionRecModel();
_TransModel.setDate(date);
_TransModel.setCategory(categoryName);
_TransModel.setTransDescription(transDesc);
_translist.add(_TransModel);
}
// Set the data into listview
listview.setAdapter(new ListAdapter(this));
mDbHelper.close();
}
And I create a rebuildListView method to set listAdapter to null and call the buildListView method again:
public void rebuildListView() {
listview.setAdapter(null);
builtListView();
}
And when I successfully insert the record into database, I refresh the list view by calling the rebuildListView:
TransactionRecController trc = new TransactionRecController(
mDbHelper.open());
if (trc.addTransactionRec(trm)) {
Toast.makeText(TransactionRec.this,
"Transaction Record Added successfully.",
Toast.LENGTH_LONG).show();
mDbHelper.close();
txtTransDesc.setText("");
txtAmount.setText("");
txtDate.setText("");
// Refresh the list view after record added
rebuildListView();
And this is my listAdapter class:
private class ListAdapter extends BaseAdapter {
LayoutInflater inflater;
ViewHolder viewHolder;
public ListAdapter(Context context) {
// TODO Auto-generated constructor stub
inflater = LayoutInflater.from(context);
}
// Bind the data to different textView for each rows
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if (convertView == null) {
convertView = inflater.inflate(R.layout.trans_listview_row,
null);
viewHolder = new ViewHolder();
viewHolder.txt_ddate = (TextView) convertView
.findViewById(R.id.txtDisplayDate);
viewHolder.txt_ddesc = (TextView) convertView
.findViewById(R.id.txtDisplayDesc);
viewHolder.txt_dcat = (TextView) convertView
.findViewById(R.id.txtDisplayCat);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.txt_ddate.setText(_translist.get(position).getDate()
.trim());
viewHolder.txt_ddesc.setText(_translist.get(position)
.getTransDescription().trim());
viewHolder.txt_dcat.setText(_translist.get(position).getCategory()
.trim());
return convertView;
}
}
However, my problem now is let's say I got record 1,2 and 3 first. Then when I added another record which is 4, the list view supposed to show me 1-4 only. But with my codes, what I am getting is 1,2,3,1,2,3,4. I wonder why the listAdapter keep on stacking the record although I set it to null and rebuild it again.
Thanks in advance.
Upvotes: 0
Views: 503
Reputation: 622
You are not clearing the old list data. you have remove the old records from the list.
public void builtListView() {
_translist.clear();
DatabaseAdapter mDbHelper = new DatabaseAdapter(this);
mDbHelper.createDatabase();
mDbHelper.open();
TransactionRecController trc = new TransactionRecController(
mDbHelper.open());
ArrayList<TransactionRecModel> trans_list = trc
.getTransactionRec(session_userID);
for (int i = 0; i < trans_list.size(); i++) {
String date = trans_list.get(i).getDate();
String categoryName = trans_list.get(i).getCategory();
String transDesc = trans_list.get(i).getTransDescription();
TransactionRecModel _TransModel = new TransactionRecModel();
_TransModel.setDate(date);
_TransModel.setCategory(categoryName);
_TransModel.setTransDescription(transDesc);
_translist.add(_TransModel);
}
// Set the data into listview
listview.setAdapter(new ListAdapter(this));
mDbHelper.close();
}
or you can reassign the values
public void builtListView() {
_translist.clear();
DatabaseAdapter mDbHelper = new DatabaseAdapter(this);
mDbHelper.createDatabase();
mDbHelper.open();
TransactionRecController trc = new TransactionRecController(
mDbHelper.open());
_translist = trc
.getTransactionRec(session_userID);
// Set the data into listview
listview.setAdapter(new ListAdapter(this));
mDbHelper.close();
}
Upvotes: 3