I think you should avoid keepAlive in this case for the bean which contains binding. Seems previous value restored later than actual value applied.
We'll check this in order to get correct explanation.. but I could advice you to split the data bean and binding bean and store only the data bean with keapAlive.
I also get -1 from getRowIndex() when I use <a4j:keepalive>. Is there any way to get getRowIndex() to return the correct row while using keepalive? I guess an attribute and a rowKeyVar will do the trick to, but it would be nice to use getRowIndex() instead.