textview.getLineCount sempre 0 in Android

Sto provando a ridimensionare dynamicmente la mia vista testuale ma il metodo getlinecount () mi restituisce sempre 0 anche dopo settext () e invalidate (). Sto usando il seguente codice:

if(convertView == null){ convertView = lInflater.inflate(R.layout.listview, null); holder = new ViewHolder(); holder.text2 = (TextView)convertView.findViewById(R.id.TextView02); convertView.setTag(holder); } else{ holder = (ViewHolder)convertView.getTag(); } holder.text2.setText(arr2[position]); holder.text2.invalidate(); int lineCnt = holder.text2.getLineCount(); 

il titolare è una class statica come segue:

  static class ViewHolder{ TextView text2; } 

il titolare contiene testo2 non nullo e anche il set di contenuti non è nullo.

Qualcuno può aiutarmi?

Grazie in anticipo.

So che questa domanda è abbastanza vecchia, ma nel caso qualcuno venga qui cercando la risposta effettiva:

 holder.text2.setText(arr2[position]); holder.text2.post(new Runnable() { @Override public void run() { int lineCnt = holder.text2.getLineCount(); // Perform any actions you want based on the line count here. } }); 

Dovrebbe essere fatto sul metodo UI discussione per posta.

 textView.post(new Runnable() { @Override public void run() { Log.v("Line count: ", textView.getLineCount()+""); } }); 

Per risolvere questo problema, applicare le seguenti righe:

 textView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (textView.getLineCount() > 1) { textView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } } }); 

OnGlobalLayoutListener verrà chiamato dopo ogni modifica a TextView (dopo averlo misurato, disegnato, ..). Qui puoi prendere le modifiche al tuo TextView prima che venga disegnato sullo schermo e fai tutto ciò che ti serve.

L’ultima riga del codice è quella di rimuovere il listener, è importante dal momento che non vogliamo continuare a catturare ogni cambiamento di layout.

getLineCount () ti darà il numero corretto di linee solo dopo un passaggio di layout. Ciò significa che TextView deve essere stato disegnato almeno una volta. Suppongo che a questo punto del tempo la tua Textview non sia disegnata, quindi stai ricevendo 0 come numero di righe

Ho creato una class asynctask e ho eseguito le mie attività getLineCount () nel suo metodo onPostExecute.

 protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new myAsyncTask().execute(null, null, null); } private class myAsyncTask extends AsyncTask { @Override protected Void doInBackground(final Void... params) { // It's okay to leave this as it is return null; } @Override protected void onPostExecute(final Void result) { super.onPostExecute(result); //DO YOUR TASK HERE, getLineCount(), etc. } } 

in realtà TextView.getLineCount () si basa su TextView.mLayout.getLineCount ma TextView.mLayout è lazy init prima di onMeasure, puoi fare così:

  if (holder.contentTV.getLayout() == null) { holder.contentTV.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { holder.contentTV.getLineCount(); holder.contentTV.getViewTreeObserver().removeOnPreDrawListener(this); return true; } }); } else { holder.contentTV.getLineCount(); }