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:
Hier mein modifizierter ArrayAdapter:
Hier mein Layout, welches als Zeile in der ListView dient:
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.
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;
}
}
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());
}
}
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>
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.