In diesem Artikel geht es um die Implementierung eines benutzerdefinierten Listen-Android-Programms. Das Programm implementiert eine ListView, die einen benutzerdefinierten Adapter zum Binden von
Daten und zum Binden von Daten mit Schaltflächen über contextView.setTag verwendet.
Wenn das System eine Liste (ListView) anzeigt, wird zunächst ein Adapter instanziiert. In diesem Artikel wird ein benutzerdefinierter Adapter instanziiert. Um
einen benutzerdefinierten Adapter zu implementieren, müssen Sie die Daten manuell zuordnen. In diesem Fall müssen Sie die Methode getView() überschreiben. Das System
ruft diese Methode auf, wenn jede Zeile der Liste gezeichnet wird.
Wenn die ListView mit dem Zeichnen beginnt, ruft das System automatisch die Funktion getCount() auf und ermittelt die Länge der ListView basierend auf dem von der Funktion zurückgegebenen Wert.
Dann ruft es basierend auf dieser Länge getView() auf Zeichnen Sie jede Linie einzeln.
Sie können sich für die spezifische Verwendung auf den folgenden Code beziehen. Denken Sie einfach an die drei Schritte zum Anpassen von ListView in Android:
Schritt 1: Hauptlayoutdateien, Komponentenlayoutdateien usw. vorbereiten.
Schritt 2: Erhalten und Daten organisieren
Teil 3: Daten binden, hier schreiben wir die Adapterklasse selbst
1. Erstellen Sie zunächst eine neue Liste.XML
Java-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="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:background="#f1e4f1"> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#666872"/> <Button android:id="@+id/view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="详细"/> </LinearLayout> <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#666872"/> </LinearLayout>
2. Erstellen Sie eine neue Adapterklasse MyAdspter.java
Java-Code
public class MyAdspter extends BaseAdapter { private List<Map<String, Object>> data; private LayoutInflater layoutInflater; private Context context; public MyAdspter(Context context,List<Map<String, Object>> data){ this.context=context; this.data=data; this.layoutInflater=LayoutInflater.from(context); } /** * 组件集合,对应list.xml中的控件 * @author Administrator */ public final class Zujian{ public ImageView image; public TextView title; public Button view; public TextView info; } @Override public int getCount() { return data.size(); } /** * 获得某一位置的数据 */ @Override public Object getItem(int position) { return data.get(position); } /** * 获得唯一标识 */ @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Zujian zujian=null; if(convertView==null){ zujian=new Zujian(); //获得组件,实例化组件 convertView=layoutInflater.inflate(R.layout.list, null); zujian.image=(ImageView)convertView.findViewById(R.id.image); zujian.title=(TextView)convertView.findViewById(R.id.title); zujian.view=(Button)convertView.findViewById(R.id.view); zujian.info=(TextView)convertView.findViewById(R.id.info); convertView.setTag(zujian); }else{ zujian=(Zujian)convertView.getTag(); } //绑定数据 zujian.image.setBackgroundResource((Integer)data.get(position).get("image")); zujian.title.setText((String)data.get(position).get("title")); zujian.info.setText((String)data.get(position).get("info")); return convertView; } }
Zur Verwendung von LayoutInflater oben: Die LayoutInflater-Klasse ist in der tatsächlichen Entwicklung immer noch sehr nützlich. Seine Funktion ähnelt findViewById(). Der Unterschied besteht darin, dass LayoutInflater zum Suchen der XML-Layoutdatei unter dem Layout verwendet wird und instanziiert wird! .
Die drei Parameter von getView(): position gibt an, welche Zeile angezeigt wird, covertView ist das aus der Layoutdatei aufgeblasene Layout
. Wir verwenden die Methode LayoutInflater, um die definierte list.xml-Datei zur Anzeige in eine View-Instanz zu extrahieren. Instanziieren Sie dann jede Komponente in der XML-Datei
, damit die Daten jeder Komponente zugeordnet werden können. Um jedoch auf das Klickereignis zu reagieren, muss die Schaltfläche einen Klick-Listener zu
hinzufügen, damit das Klickereignis erfasst werden kann.
3. ListView-Steuerelement in Activity_main.xml hinzufügen
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent"></ListView> </RelativeLayout>
public class MainActivity extends Activity { private ListView listView=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=(ListView)findViewById(R.id.list); List<Map<String, Object>> list=getData(); listView.setAdapter(new MyAdspter(this, list)); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public List<Map<String, Object>> getData(){ List<Map<String, Object>> list=new ArrayList<Map<String,Object>>(); for (int i = 0; i < 10; i++) { Map<String, Object> map=new HashMap<String, Object>(); map.put("image", R.drawable.ic_launcher); map.put("title", "这是一个标题"+i); map.put("info", "这是一个详细信息"+i); list.add(map); } return list; } }