Antworten:
Wenn Sie eine benutzerdefinierte Ansicht in a verwenden ListView
, müssen Sie das Zeilenlayout definieren. Sie erstellen eine XML-Datei, in der Sie Android-Widgets platzieren, und im Code des Adapters müssen Sie Folgendes tun:
public MyAdapter(Context context, List<MyObject> objects) extends ArrayAdapter {
super(context, 1, objects);
/* We get the inflator in the constructor */
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
/* We inflate the xml which gives us a view */
view = mInflater.inflate(R.layout.my_list_custom_row, parent, false);
/* Get the item in the adapter */
MyObject myObject = getItem(position);
/* Get the widget with id name which is defined in the xml of the row */
TextView name = (TextView) view.findViewById(R.id.name);
/* Populate the row's xml with info from the item */
name.setText(myObject.getName());
/* Return the generated view */
return view;
}
Lesen Sie mehr in der offiziellen Dokumentation .
View view = convertView; if (view == null) { view = mInflater.... }
LayoutInflater
ist, obwohl es erklärt, wo es verwendet werden soll. Die Antwort 1-down ist besser.
Die LayoutInflater- Klasse wird verwendet, um den Inhalt von Layout-XML-Dateien in die entsprechenden View-Objekte zu instanziieren.
Mit anderen Worten, es wird eine XML-Datei als Eingabe verwendet und die View-Objekte daraus erstellt.
single_list_item.xml
Datei für jede Zeile von a ListView
. Ist die Verwendung dieser XML-Datei wie ein Inflater?
LayoutInflator
dasAls ich mit der Android-Programmierung anfing, war ich wirklich verwirrt von LayoutInflater
und findViewById
. Manchmal haben wir das eine und manchmal das andere benutzt.
LayoutInflater
wird verwendet, um ein neues View
(oder Layout
) Objekt aus einem Ihrer XML-Layouts zu erstellen.findViewById
gibt Ihnen nur einen Verweis auf eine Ansicht, die bereits erstellt wurde. Man könnte denken , dass Sie keine Ansichten noch erstellt haben, aber wenn Sie rufen setContentView
inonCreate
, das Layout der Tätigkeit zusammen mit seiner Subviews aufgeblasen wird (erstellt) hinter den Kulissen.Wenn die Ansicht bereits vorhanden ist, verwenden Sie findViewById
. Wenn nicht, erstellen Sie es mit einem LayoutInflater
.
Hier ist ein Mini-Projekt, das ich gemacht habe und das sowohl zeigt LayoutInflater
als auch findViewById
in Aktion ist. Ohne speziellen Code sieht das Layout folgendermaßen aus.
Das blaue Quadrat ist ein benutzerdefiniertes Layout, das mit in das Hauptlayout eingefügt wird include
(siehe hier für weitere Informationen). Es wurde automatisch aufgeblasen, da es Teil der Inhaltsansicht ist. Wie Sie sehen können, hat der Code nichts Besonderes.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Lassen Sie uns nun eine weitere Kopie unseres benutzerdefinierten Layouts aufblasen (erstellen) und hinzufügen.
LayoutInflater inflater = getLayoutInflater();
View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false);
Um das neue Ansichtslayout aufzublähen, habe ich dem Inflater lediglich den Namen meiner XML-Datei ( my_layout
) mitgeteilt , das übergeordnete Layout, zu dem ich es hinzufügen möchte ( mainLayout
), und das ich noch nicht hinzufügen möchte ( false
) . (Ich könnte auch die Eltern auf einstellennull
, aber dann werden die Layoutparameter der Stammansicht meines benutzerdefinierten Layouts ignoriert.)
Hier ist es wieder im Kontext.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// inflate the main layout for the activity
setContentView(R.layout.activity_main);
// get a reference to the already created main layout
LinearLayout mainLayout = (LinearLayout) findViewById(R.id.activity_main_layout);
// inflate (create) another copy of our custom layout
LayoutInflater inflater = getLayoutInflater();
View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false);
// make changes to our custom layout and its subviews
myLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorAccent));
TextView textView = (TextView) myLayout.findViewById(R.id.textView);
textView.setText("New Layout");
// add our custom layout to the main layout
mainLayout.addView(myLayout);
}
}
Beachte wie findViewById
nur verwendet wird, nachdem ein Layout bereits aufgeblasen wurde.
Hier ist die XML für das obige Beispiel.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main_layout"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<!-- Here is the inserted layout -->
<include layout="@layout/my_layout"/>
</LinearLayout>
my_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/colorPrimary">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:padding="5dp"
android:textColor="@android:color/white"
android:text="My Layout"/>
</RelativeLayout>
RecyclerView
. (In diesen RecyclerView
Beispielen finden Sie eine Liste oder ein Raster Sie in .) Sie müssen für jedes einzelne sichtbare Element in der Liste oder im Raster ein neues Layout aufblasen.myLayout
ist eine Ansicht, obwohl ich sie als RelativeLayout hätte aufblasen können (siehe my_layout.xml). Nachdem es aufgeblasen ist, füge ich es als Unteransicht des LinearLayout-übergeordneten Elements (dh mainLayout
) hinzu.
LayoutInflater.inflate () bietet eine Möglichkeit, eine res / layout / *. Xml-Datei, die eine Ansicht definiert, in ein tatsächliches View-Objekt zu konvertieren, das in Ihrem Anwendungsquellcode verwendet werden kann.
Grundlegende zwei Schritte: Holen Sie sich den Inflater und blasen Sie dann die Ressource auf
Wie bekommt man den Inflater?
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Wie erhalten Sie die Ansicht, wenn die XML-Datei "list_item.xml" lautet?
View view = inflater.inflate(R.layout.list_item, parent, false);
Hier ist ein weiteres Beispiel ähnlich dem vorherigen, das jedoch erweitert wurde, um die Aufblasparameter und das dynamische Verhalten, das es bieten kann, weiter zu demonstrieren.
Angenommen, Ihr ListView-Zeilenlayout kann eine variable Anzahl von TextViews enthalten. Zuerst blasen Sie die Basiselementansicht auf (genau wie im vorherigen Beispiel) und fügen dann zur Laufzeit dynamisch TextViews hinzu. Mit android: layout_weight richtet zusätzlich alles perfekt aus.
Hier sind die Ressourcen für Layouts:
list_layout.xml
<?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="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/field1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"/>
<TextView
android:id="@+id/field2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
schedule_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
Außer Kraft setzen getView Verfahren in Erweiterung der Klasse BaseAdapter
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = activity.getLayoutInflater();
View lst_item_view = inflater.inflate(R.layout.list_layout, null);
TextView t1 = (TextView) lst_item_view.findViewById(R.id.field1);
TextView t2 = (TextView) lst_item_view.findViewById(R.id.field2);
t1.setText("some value");
t2.setText("another value");
// dinamically add TextViews for each item in ArrayList list_schedule
for(int i = 0; i < list_schedule.size(); i++){
View schedule_view = inflater.inflate(R.layout.schedule_layout, (ViewGroup) lst_item_view, false);
((TextView)schedule_view).setText(list_schedule.get(i));
((ViewGroup) lst_item_view).addView(schedule_view);
}
return lst_item_view;
}
Beachten Sie verschiedene Aufrufe der Inflate-Methode:
inflater.inflate(R.layout.list_layout, null); // no parent
inflater.inflate(R.layout.schedule_layout, (ViewGroup) lst_item_view, false); // with parent preserving LayoutParams
Diese Klasse wird verwendet, um Layout-XML-Dateien in die entsprechenden View
Objekte zu instanziieren . Es wird niemals direkt verwendet - verwenden getLayoutInflater()
oder getSystemService(String)
zum Abrufen einer Standardinstanz LayoutInflater
, die bereits mit dem aktuellen Kontext verbunden und für das Gerät, auf dem Sie ausgeführt werden, korrekt konfiguriert ist. Zum Beispiel:
LayoutInflater inflater = (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
Referenz: http://developer.android.com/reference/android/view/LayoutInflater.html
Aufblasen bedeutet, die XML-Datei zu lesen, die ein Layout (oder ein GUI-Element) beschreibt, und die tatsächlichen Objekte zu erstellen, die diesem entsprechen, und so das Objekt in einer Android-App sichtbar zu machen.
final Dialog mDateTimeDialog = new Dialog(MainActivity.this);
// Inflate the root layout
final RelativeLayout mDateTimeDialogView = (RelativeLayout) getLayoutInflater().inflate(R.layout.date_time_dialog, null);
// Grab widget instance
final DateTimePicker mDateTimePicker = (DateTimePicker) mDateTimeDialogView.findViewById(R.id.DateTimePicker);
Diese Datei könnte als date_time_dialog.xml gespeichert werden :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/DateTimeDialog" android:layout_width="100px"
android:layout_height="wrap_content">
<com.dt.datetimepicker.DateTimePicker
android:id="@+id/DateTimePicker" android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<LinearLayout android:id="@+id/ControlButtons"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_below="@+id/DateTimePicker"
android:padding="5dip">
<Button android:id="@+id/SetDateTime" android:layout_width="0dip"
android:text="@android:string/ok" android:layout_weight="1"
android:layout_height="wrap_content"
/>
<Button android:id="@+id/ResetDateTime" android:layout_width="0dip"
android:text="Reset" android:layout_weight="1"
android:layout_height="wrap_content"
/>
<Button android:id="@+id/CancelDialog" android:layout_width="0dip"
android:text="@android:string/cancel" android:layout_weight="1"
android:layout_height="wrap_content"
/>
</LinearLayout>
Diese Datei könnte als date_time_picker.xml gespeichert werden :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content" `enter code here`
android:padding="5dip" android:id="@+id/DateTimePicker">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:baselineAligned="true"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/month_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp"
android:layout_marginTop="5dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="5dp"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/month_plus"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/image_button_up_final"/>
<EditText
android:id="@+id/month_display"
android:layout_width="45dp"
android:layout_height="35dp"
android:background="@drawable/picker_middle"
android:focusable="false"
android:gravity="center"
android:singleLine="true"
android:textColor="#000000">
</EditText>
<Button
android:id="@+id/month_minus"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
android:id="@+id/date_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="0.5dp"
android:layout_marginTop="5dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="5dp"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/date_plus"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/image_button_up_final"/>
<EditText
android:id="@+id/date_display"
android:layout_width="45dp"
android:layout_height="35dp"
android:background="@drawable/picker_middle"
android:gravity="center"
android:focusable="false"
android:inputType="number"
android:textColor="#000000"
android:singleLine="true"/>
<Button
android:id="@+id/date_minus"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
android:id="@+id/year_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="0.5dp"
android:layout_marginTop="5dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="5dp"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/year_plus"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/image_button_up_final"/>
<EditText
android:id="@+id/year_display"
android:layout_width="45dp"
android:layout_height="35dp"
android:background="@drawable/picker_middle"
android:gravity="center"
android:focusable="false"
android:inputType="number"
android:textColor="#000000"
android:singleLine="true"/>
<Button
android:id="@+id/year_minus"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
android:id="@+id/hour_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/hour_plus"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/image_button_up_final"/>
<EditText
android:id="@+id/hour_display"
android:layout_width="45dp"
android:layout_height="35dp"
android:background="@drawable/picker_middle"
android:gravity="center"
android:focusable="false"
android:inputType="number"
android:textColor="#000000"
android:singleLine="true">
</EditText>
<Button
android:id="@+id/hour_minus"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
android:id="@+id/min_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="0.35dp"
android:layout_marginTop="5dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="5dp"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/min_plus"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/image_button_up_final"/>
<EditText
android:id="@+id/min_display"
android:layout_width="45dp"
android:layout_height="35dp"
android:background="@drawable/picker_middle"
android:gravity="center"
android:focusable="false"
android:inputType="number"
android:textColor="#000000"
android:singleLine="true"/>
<Button
android:id="@+id/min_minus"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
android:id="@+id/meridiem_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="0.35dp"
android:layout_marginTop="5dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="5dp"
android:gravity="center"
android:orientation="vertical">
<ToggleButton
android:id="@+id/toggle_display"
style="@style/SpecialToggleButton"
android:layout_width="40dp"
android:layout_height="32dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="45dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="5dp"
android:padding="5dp"
android:gravity="center"
android:textOn="@string/meridiem_AM"
android:textOff="@string/meridiem_PM"
android:checked="true"/>
<!-- android:checked="true" -->
</LinearLayout>
</LinearLayout>
</RelativeLayout>
Die MainActivity
als MainActivity.java gespeicherte Klasse :
public class MainActivity extends Activity {
EditText editText;
Button button_click;
public static Activity me = null;
String meridiem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText)findViewById(R.id.edittext1);
button_click = (Button)findViewById(R.id.button1);
button_click.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view){
final Dialog mDateTimeDialog = new Dialog(MainActivity.this);
final RelativeLayout mDateTimeDialogView = (RelativeLayout) getLayoutInflater().inflate(R.layout.date_time_dialog, null);
final DateTimePicker mDateTimePicker = (DateTimePicker) mDateTimeDialogView.findViewById(R.id.DateTimePicker);
// mDateTimePicker.setDateChangedListener();
((Button) mDateTimeDialogView.findViewById(R.id.SetDateTime)).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mDateTimePicker.clearFocus();
int hour = mDateTimePicker.getHour();
String result_string = mDateTimePicker.getMonth() +" "+ String.valueOf(mDateTimePicker.getDay()) + ", " + String.valueOf(mDateTimePicker.getYear())
+ " " +(mDateTimePicker.getHour()<=9? String.valueOf("0"+mDateTimePicker.getHour()) : String.valueOf(mDateTimePicker.getHour())) + ":" + (mDateTimePicker.getMinute()<=9?String.valueOf("0"+mDateTimePicker.getMinute()):String.valueOf(mDateTimePicker.getMinute()))+" "+mDateTimePicker.getMeridiem();
editText.setText(result_string);
mDateTimeDialog.dismiss();
}
});
// Cancel the dialog when the "Cancel" button is clicked
((Button) mDateTimeDialogView.findViewById(R.id.CancelDialog)).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
mDateTimeDialog.cancel();
}
});
// Reset Date and Time pickers when the "Reset" button is clicked
((Button) mDateTimeDialogView.findViewById(R.id.ResetDateTime)).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
mDateTimePicker.reset();
}
});
// Setup TimePicker
// No title on the dialog window
mDateTimeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
// Set the dialog content view
mDateTimeDialog.setContentView(mDateTimeDialogView);
// Display the dialog
mDateTimeDialog.show();
}
});
}
}
Was macht der Inflater?
Es nimmt ein XML-Layout als Eingabe (z. B.) und konvertiert es in ein View-Objekt.
Warum gebraucht
Stellen wir uns ein Szenario vor, in dem wir eine benutzerdefinierte Listenansicht erstellen müssen. Jetzt sollte jede Zeile benutzerdefiniert sein. Aber wie können wir das machen? Es ist nicht möglich, einer Zeile mit Listenansicht ein XML-Layout zuzuweisen. Also erstellen wir ein View-Objekt. Auf diese Weise können wir auf die darin enthaltenen Elemente (Textansicht, Bildansicht usw.) zugreifen und das Objekt auch als Zeile der Listenansicht zuweisen
Wenn wir also irgendwo ein Objekt vom Typ Ansicht zuweisen müssen und unser benutzerdefiniertes XML-Design haben, konvertieren wir es einfach per Inflater in ein Objekt und verwenden es.
LayoutInflater ist eine Klasse, mit der Layout-XML-Dateien in die entsprechenden Ansichtsobjekte instanziiert werden, die in Java-Programmen verwendet werden können. In einfachen Worten gibt es zwei Möglichkeiten, eine Benutzeroberfläche in Android zu erstellen. Einer ist statisch und ein anderer dynamisch oder programmgesteuert. Angenommen, wir haben ein einfaches Layout main.xml mit einem textview
und einem edittext
wie folgt.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/layout1"
>
<TextView
android:id="@+id/namelabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enter your name"
android:textAppearance="?android:attr/textAppearanceLarge" >
</TextView>
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginTop="14dp"
android:ems="10">
</EditText>
</LinearLayout>
Wir können dieses Layout statisch anzeigen, indem wir
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Eine dynamische Art, eine Ansicht zu erstellen, bedeutet, dass die Ansicht in unserer main.xml nicht erwähnt wird, wir sie jedoch zur Laufzeit anzeigen möchten. Zum Beispiel haben wir ein anderes XML im Layoutordner als footer.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TextView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="Add your record"
android:textSize="24sp" >
</TextView>
Wir möchten dieses Textfeld zur Laufzeit in unserer Hauptbenutzeroberfläche anzeigen. Also hier werden wir text.xml aufblasen. Siehe wie:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TextView t = (TextView)inflater.inflate(R.layout.footer,null);
lLayout = (LinearLayout)findViewById(R.id.layout1);
lLayout.addView(t);
Hier habe ich getSystemService (String) verwendet, um eine LayoutInflater-Instanz abzurufen. Ich kann auch getLayoutInflator () zum Aufblasen verwenden, anstatt getSystemService (String) wie unten zu verwenden:
LayoutInflator inflater = getLayoutInflater();
TextView t = (TextView) inflater.inflate(R.layout.footer, null);
lLayout.addView(t);
Hier ist ein Beispiel für das Abrufen einer Referenz für die Stammansicht eines Layouts, das Aufblasen und die Verwendung mit setContentView (Ansichtsansicht).
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater li=getLayoutInflater();
View rootView=li.inflate(R.layout.activity_main,null);
setContentView(rootView);
}
Layout Inflater ist eine Klasse, die die Beschreibung des XML-Erscheinungsbilds liest und sie in Java-basierte View-Objekte konvertiert.
Meine benutzerdefinierte Liste hoffe, dass es das Konzept illustriert
public class second extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
// TextView textview=(TextView)findViewById(R.id.textView1);
// textview.setText(getIntent().getExtras().getString("value"));
setListAdapter(new MyAdapter(this,R.layout.list_item,R.id.textView1, getResources().getStringArray(R.array.counteries)));
}
private class MyAdapter extends ArrayAdapter<String>{
public MyAdapter(Context context, int resource, int textViewResourceId,
String[] objects) {
super(context, resource, textViewResourceId, objects);
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row=inflater.inflate(R.layout.list_item,parent,false);
String[]items=getResources().getStringArray(R.array.counteries);
ImageView iv=(ImageView) row.findViewById(R.id.imageView1);
TextView tv=(TextView) row.findViewById(R.id.textView1);
tv.setText(items[position]);
if(items[position].equals("unitedstates")){
iv.setImageResource(R.drawable.usa);
}else if(items[position].equals("Russia")){
iv.setImageResource(R.drawable.russia);
}else if(items[position].equals("Japan")){
iv.setImageResource(R.drawable.japan);
}
// TODO Auto-generated method stub
return row;
}
}
}
LayoutInflater erstellt Ansichtsobjekte basierend auf in XML definierten Layouts. Es gibt verschiedene Möglichkeiten, LayoutInflater zu verwenden, z. B. das Erstellen benutzerdefinierter Ansichten, das Aufblasen von Fragmentansichten in Aktivitätsansichten, das Erstellen von Dialogen oder das einfache Aufblasen einer Layoutdateiansicht in eine Aktivität.
Es gibt viele Missverständnisse darüber, wie der Inflationsprozess funktioniert. Ich denke, das liegt an der schlechten Dokumentation für die inflate () -Methode. Wenn Sie mehr über die inflate () -Methode erfahren möchten, habe ich hier einen Blog-Beitrag darüber geschrieben:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
Inflater konvertiert tatsächlich eine Art Konvertierung in Daten, Ansichten, Instanzen, in sichtbare UI-Darstellungen. Dadurch werden Daten verwendet, die möglicherweise von Adaptern usw. programmgesteuert eingegeben werden. Integrieren Sie es dann in eine von Ihnen definierte XML-Datei, die angibt, wie die Daten in der Benutzeroberfläche dargestellt werden sollen