[fortgeschritten] TextView.getLineCount in einer ListView

  • 1 Antworten
  • Neuester Beitrag
Diskutiere [fortgeschritten] TextView.getLineCount in einer ListView im Android App Entwicklung im Bereich Betriebssysteme & Apps.
T

Tersus

Gast
Guten Abend,

wenn ich bisher wissen wollte, wie viele Zeilen eine TextView nach dem Bauen auf meinem Bildschirm hat, habe ich ihr bisher immer einen OnLayoutChangeListener angehängt und in diesem die getLineCount() aufgerufen.

Nun habe ich eine ListView mit sehr vielen TextViews. Ich kann doch nun unmöglich jeder TextView einen Listener anhängen, oder?

Hier meine modifizierte ListActivity:
Code:
package com.example.test;
import android.app.ListActivity;
import android.os.Bundle;

public class MainActivity extends ListActivity {

    private final int anzahlZeichenketten = 30;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                       
        mod_ArrayAdapter mAA = new mod_ArrayAdapter(this, generiereZeichenketten());
        
        this.setListAdapter(mAA);
        
    }
    
    private String[] generiereZeichenketten(){
        
        String[] Zeichenketten = new String[anzahlZeichenketten];
        StringBuilder[] SB_Zeichenketten = new StringBuilder[anzahlZeichenketten];
        
        for(int z = 0; z < anzahlZeichenketten; z++){
            
            SB_Zeichenketten[z] = new StringBuilder("Zeichenkette Nr." + z + " : ");
            
            for(int z2 = 0; z2 < z; z2++){
                
                SB_Zeichenketten[z].append("0");
                
            }
        
            Zeichenketten[z] = SB_Zeichenketten[z].toString();
            
        }
        
        return Zeichenketten;
    }

}
Hier mein modifizierter ArrayAdapter:
Code:
package com.example.test;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnLayoutChangeListener;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class mod_ArrayAdapter extends ArrayAdapter<String> implements OnLayoutChangeListener{
    
    private Context _Context;
    private String[] _Werte;
    
    public mod_ArrayAdapter(Context context, String[] Werte) {
        super(context, R.layout.zeilenelement_adapter, Werte);

        this._Context = context;
        this._Werte = Werte;        
        
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View Ansicht = convertView;
        
        if(Ansicht == null){
            
            LayoutInflater Inflater = (LayoutInflater) _Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            Ansicht = Inflater.inflate(R.layout.zeilenelement_adapter, null);
            
            AnsichtenBehaelter AB = new AnsichtenBehaelter();
            
            AB._Zeilenanzeiger = (TextView) Ansicht.findViewById(R.id.textView1);
            AB._AnsichtenElement = (TextView) Ansicht.findViewById(R.id.textView2);
            
            // Hier bin ich etwas misstrauisch
            fragwuerdigeMethode(AB);
            
            Ansicht.setTag(AB);
        }
        
        AnsichtenBehaelter AB = (AnsichtenBehaelter) Ansicht.getTag();
        
        AB._AnsichtenElement.setText(_Werte[position]);
        
        // Folgende Methode funktioniert (ohne Listener) nicht
        AB._Zeilenanzeiger.setText("Zeilen: " + AB._AnsichtenElement.getLineCount());
        
        return Ansicht;
        
    }
    
    private void fragwuerdigeMethode(AnsichtenBehaelter AB){
        
        // Die Schriftgröße der TextView wird zur Laufzeit im Adapter verändert.
        // Ist das sinnvoll, bzw. geht es schon früher?
        AB._Zeilenanzeiger.setTextSize(14 * _Context.getResources().getDisplayMetrics().density);
        AB._AnsichtenElement.setTextSize(18 * _Context.getResources().getDisplayMetrics().density);
        
        // Partner Element speichern
        AB._AnsichtenElement.setTag(AB._Zeilenanzeiger);

        // Hier wird der Listener zugefügt
        AB._AnsichtenElement.addOnLayoutChangeListener(this);
        
    }
    
    private static class AnsichtenBehaelter{
        
        public TextView _Zeilenanzeiger;
        public TextView    _AnsichtenElement;
    
    }

    @Override
    public void onLayoutChange(View v, int left, int top, int right,
            int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {

        // auf das Partnerelement zugreifen und den Text entsprechend ändern.
        
        ((TextView) v.getTag()).setText("Zeilen: " + ((TextView) v).getLineCount());
        
    }
    
}
Hier mein Layout, welches als Zeile in der ListView dient:
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</LinearLayout>
Das funktioniert so natürlich, jedoch mache ich mir Sorgen um die Effizienz.

Der Listener wird doch ständig beim Scrollen aufgerufen oder nicht?

Es befinden sich stets zwei TextViews nebeneinander. Die linke gibt die Zeilen der rechten aus.
 
ui_3k1

ui_3k1

Gesperrt

Hmm, kannst dir ja mal die CPU Auslastung anzeigen lassen.
Manchmal ist Code deutlich effizienter (bzw. ineffizienter), als er aussieht. :D
 
Ähnliche Themen - [fortgeschritten] TextView.getLineCount in einer ListView Antworten Datum
1
4