Lo avevo provato ma mi sà che avevo sbagliato qualcosa...succede una cosa strana però:
Allora vi descrivo cosa deve succedere
ho questo textview in una scrollview con 20/n/n/n/n/n/n inizialmente
ho ppoi un pulsante "+1" che aggiunge righe 20\n21\n22\n\n\n\n\n\n ... eccc
Unica cosa...se pigio velocemente + volte il pulsante nel giro di 1 secondo circa....scrive modifica l'ultima riga e mette direttamente il numero finale quindi se da 20\n\n\n\n\n\n pigio velocemente il pulsante, prima aggiunge la riga 20\n21\n\n\n\n\n\n mentre alla seconda pressione modifica il 21 in 22....facendo diventare il testo 20\n22\n\n\n\n\n\n
Ecco il codice:
<ScrollView
android:id="@+id/ScrollViewMe"
android:layout_height="240dip"
android:layout_width="50dip"
android:layout_x="10dip"
android:layout_y="165dip">
<TextView
android:id="@+id/Me"
android:layout_height="wrap_content"
android:layout_width="50dip"
android:textColor="#000000"
android:background="#ffffff" android:minHeight="239dip" android:gravity="right" android:paddingRight="17dip" android:text="20\n\n\n\n\n\n"/>
</ScrollView>
<Button android:layout_x="70dip" android:layout_y="164dip" android:layout_width="78dip" android:layout_height="50dip" android:id="@+id/ButtonME_P1" android:text="+1 PV" android:textSize="22dip" android:onClick="ClickPV"></Button>long lastChangeMePV=System.nanoTime();
long delayToMerge=new Long("1000000000").longValue();
....
....
....
....
public void ClickPV(View btn) { //metodo click listener
changePV((TextView)findViewById(R.id.Me),1);
}
public void changePV(TextView Player, int change) {
long now = System.nanoTime(); //prendo il timestamp della chiamata
String s;
String precPV;
int PV;
if (now - lastChangeMePV < delayToMerge){ //Se è passato poco tempo dall'ultima modifica fà il ramo Then dell IF
s=Player.getText().toString().substring(0, Player.getText().toString().length()-6); //s diventa la stringa uguale al testo
//del textview senza le 6 righe finali vuote
try{
precPV=s.substring(s.lastIndexOf('\n')+1); //in precPV recupera il numero nell'ultima riga
s=s.substring(0,s.lastIndexOf('\n')); //cancella da s anche quella riga
} catch(Exception seUnaSolaRiga){ //Eccezione se c'era solo una riga(comunque è un caso improbabile che avvenga)
precPV=s.substring(0);
}
PV = new Integer(precPV).intValue() + change; //in PV ho il nuovo numero da aggiungere al textView
Player.setText(s + "\n" + new Integer(PV).toString() + "\n\n\n\n\n\n", TextView.BufferType.SPANNABLE);
Spannable str = (Spannable) Player.getText();
str.setSpan(new StrikethroughSpan(), 0, s.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//modificato il testodel textview aggiungendo il nuovo numero oltre le 6 righe vuote
//e con lo strikethrough alle rige precedenti
} else { //ramo else dell'IF : Assoultamente identico manca solo la riga di codice "s=s.substring(0,s.lastIndexOf('\n'));"
// poichè devo aggiungere la riga lasciando la riga precedente
s=Player.getText().toString().substring(0, Player.getText().toString().length()-6);
try{
precPV=s.substring(s.lastIndexOf('\n')+1);
} catch(Exception seUnaSolaRiga){
precPV=s.substring(0);
}
PV = new Integer(precPV).intValue() + change;
Player.setText(s + "\n" + new Integer(PV).toString() + "\n\n\n\n\n\n", TextView.BufferType.SPANNABLE);
Spannable str = (Spannable) Player.getText();
str.setSpan(new StrikethroughSpan(), 0, s.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
lastChangeMePV=now; //aggiorno il timestamp dell'ultima modifica
((ScrollView)findViewById(R.id.ScrollViewMe)).scrollTo(0, (Player.getLineCount())*Player.getLineHeight());
//scrollo tutto in fondo il textview
}A questo punto succede una cosa strana:
Lo scroll avviene solo se l'esecuzione passa dal ramo Then dell'IF(anche se era scrollato verso l'alto...si sposta in fondo).
Ho controllato a Debug che i valori che passo al metodo scrollTo(int,int) sono identici passando da entrambi i rami
L'unica cosa che cambia nei 2 rami è quella riga di codice:
s=s.substring(0,s.lastIndexOf('\n'));e il fatto che nel ramo Then non modifico le dimensioni mentre nell'else di fatto aumento di una riga il textview
!!!!!!!!!!!Come mai?

Cmq per arginare il problema ho provato a modificare cosi il ClickPV(View btn)
public void ClickPV(View btn) {
changePV((TextView)findViewById(R.id.Me),1);
changePV((TextView)findViewById(R.id.Me),0);
}Dopotutto se clicco 2 volte sul pulsante in meno di un secondo....chiamo 2 volte la changePV(textView,int)...
Ma così .... che faccio in pratica la stessa cosa.....non funziona....... :S
Aiutatemi
grazie