Sharang Gupta Sharang Gupta - 1 month ago 26
Android Question

My listview is not being updated even after calling notifydatasetchanged()

I don't know why but my list view does not get updated...I am calling notifyDataSetChanged() and I also tried another answer where they asked to do this :

private void editTransaction(int position) {
h = historyItems.get(position);
historyItems.remove(position);
this.position = position;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == 5 && resultCode == RESULT_OK) {
String description = data.getStringExtra("description");
if (description == null) description = "no description";

double amount = Double.parseDouble(data.getStringExtra("amount"));

h.setDescription(description);
h.setAmount(amount);
//h.setTimestamp(System.currentTimeMillis());

//this is where I am updating my arraylist....

historyItems.add(position,h);
adapter.notifyDataSetChanged();


user.makeEdit(h);

}
}


this is in my custom adapter.

public class HistoryCustomAdapter extends BaseAdapter {

Context context;
ArrayList<HistoryItem> historyItems;
HashMap<String,String> iconMapper;

private static LayoutInflater inflater=null;

public HistoryCustomAdapter(Context context, ArrayList<HistoryItem> historyItems, HashMap<String, String> iconMapper) {
this.context=context;
this.historyItems=historyItems;
this.iconMapper=iconMapper;
inflater = ( LayoutInflater )context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
return historyItems != null ? historyItems.size() : 0;
}

@Override
public Object getItem(int position) {
return historyItems.get(position);
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
@Override
public View getView(int position, View convertView, ViewGroup parent) {

Holder holder;
if (convertView == null) {
holder = new Holder();
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.history_item, parent, false);

holder.tvCat = (TextView)convertView.findViewById(R.id.tv_category);
holder.tvAmt = (TextView)convertView.findViewById(R.id.tv_amount);
holder.tvDate = (TextView)convertView.findViewById(R.id.tv_date);
holder.img = (ImageView)convertView.findViewById(R.id.iv);
convertView.setTag(holder);

}

holder=(Holder)convertView.getTag();
HistoryItem historyItem;
historyItem = historyItems.get(position);

holder.tvCat.setText(historyItem.getCategory());
holder.tvAmt.setText(historyItem.getAmount()+"");

DateFormat df = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss");
Calendar c = Calendar.getInstance();
c.setTimeInMillis(historyItem.getTimestamp());
Date day = c.getTime();

holder.tvDate.setText(df.format(day));

Resources res = context.getResources();
String mDrawableName = iconMapper.get(historyItem.getCategory());
int resID = res.getIdentifier(mDrawableName , "drawable", context.getPackageName());
holder.img.setImageResource(resID);

return convertView;
}

public void refresh(ArrayList<HistoryItem> historyItems)
{
this.historyItems.clear();
this.historyItems.addAll(historyItems);
//notifyDataSetChanged();
}

public class Holder
{
TextView tvCat,tvAmt,tvDate;
ImageView img;
}

}


I dont know why is my listview not being updated immediately...Should i switch to ArrayAdapters?

Answer

Try to clear your this.historyItems then this.historyItems.addAll(historyItems). Hope it works!

Anyway if you try ViewHolder Pattern, you should reuse it:

if (rowView == null) {
   // init view, holder
   rowView.setTag(holder)
} else {
   holder = (Holder) rowView.getTag();
}

// fill data

maybe its the reason why your listview didnt reflect immediately.