This is my activity :
public class Messaging extends Activity implements OnItemClickListener {
ListView lstv;
MessagingAdapter listAdapter;
List<Generic4lstv> rowItems = new ArrayList<Generic4lstv>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messaging);
// lstv
lstv = (ListView) findViewById(R.id.lstv_mess);
lstv.setOnItemClickListener(this);
listAdapter = new MessagingAdapter(this, rowItems);
lstv.setAdapter(listAdapter);
fillListview();
}
//***the trick
private final int interval = 200; // 1 Second
private Handler handler = new Handler();
private Runnable runnable = new Runnable(){
public void run() {
listAdapter.notifyDataSetChanged();
}
};
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
if (!rowItems.get(arg2).getIsSelected()) {
Log.w("wwwwwww", "in");
rowItems.get(arg2).setIsSelected(true);
//call the ***trick
handler.postDelayed(runnable, interval);
}
}
This my adapter :
public class MessagingAdapter extends BaseAdapter {
private List<Generic4lstv> data;
private Context context;
public MessagingAdapter(Context context, List<Generic4lstv> items) {
this.context = context;
this.data = items;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
View row = convertView;
ViewHolder holder;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(R.layout.activity_messaging_row, arg2, false);
holder = new ViewHolder();
holder.rowText = (TextView) row.findViewById(R.id.titleTextView);
holder.rowDate = (TextView) row.findViewById(R.id.dateTextView);
holder.rowImage = (ImageView) row.findViewById(R.id.mailIcon);
// store the holder with the view.
row.setTag(holder);
} else {
// we've just avoided calling findViewById() on resource everytime
// just use the viewHolder
holder = (ViewHolder) row.getTag();
}
Generic4lstv item = (Generic4lstv) getItem(position);
if (item == null) {
Log.w("wwwwwww", "isnull!!!");
} else {
holder.rowText.setText(item.getRowText());
holder.rowDate.setText(item.getRowTextDate());
if (item.getIsSelected()) { // aka is red
Log.w("wwwwwww", "IsSelected" + item.getRowID());
holder.rowText.setTextColor(Color.GRAY);
holder.rowImage.setImageResource(R.drawable.mail);
} else {
Log.w("wwwwwww", "Is NOT Selected" + item.getRowID());
holder.rowText.setTextColor(Color.BLACK);
holder.rowImage.setImageResource(R.drawable.mail_new);
}
}
return row;
}
static class ViewHolder {
ImageView rowImage;
TextView rowText;
TextView rowDate;
}
}
As you can see, at Activity onItemClick event I call a runnable which do the adapter notifyDataSetChanged, all is working fine, but if I execute the listAdapter.notifyDataSetChanged(); after rowItems.get(arg2).setIsSelected(true); line the UI didnt update!!
Runnable created after I spent 2hrs on it and in the end I red this: https://stackoverflow.com/a/19074462/1320686
Can someone provide a better way, or I do something wrong in code?