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?