Wenn Sie eine Android-App entwickeln, werden Sie sich auf jeden Fall treffen "Die Hölle einer ListView, die einen benutzerdefinierten Adapter beißt"
Es wäre nicht möglich, wenn es einmal implementiert wäre. Dieses Mal möchte ich noch weiter gehen und einen Button in die ListView einfügen.
Überraschenderweise gibt es viele solche Szenen, oder? CheckBox, Schaltfläche bearbeiten oder löschen.
Dieses Mal möchte ich mein Bestes geben, um die Benutzeroberfläche unten zu erstellen. Es ist ein Ersatz für ein persönliches Memo.
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String[] countries = {
"America",
"Japan",
"China",
"Korea",
"British",
"German"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView);
CustomAdapter adapter = new CustomAdapter(getApplicationContext(), R.layout.row_item, countries);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (view.getId()) {
case R.id.edit:
Toast.makeText(MainActivity.this, countries[position] + "Die Schaltfläche Bearbeiten wurde gedrückt", Toast.LENGTH_SHORT).show();
break;
case R.id.delete:
Toast.makeText(MainActivity.this, countries[position] + "Die Löschtaste wurde gedrückt", Toast.LENGTH_SHORT).show();
break;
}
}
});
}
}
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
tools:context="hiroto.myapplication.MainActivity">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@color/gray"
android:dividerHeight="1dp"/>
</LinearLayout>
Dieses Mal ist nur ListView für MainActivity vorbereitet. Die ListView wird von dem unten eingeführten benutzerdefinierten Adapter gebissen, und eine benutzerdefinierte ListView, die den Text mit zwei Schaltflächen anzeigt, wird konfiguriert.
Die Einschränkung besteht darin, der ListView einen "SetOnItemClickListener" zu geben, um das Klickereignis von der Adapterseite abzurufen. Vergiss nicht ...
Um festzustellen, um welche Schaltfläche es sich bei dem erfassten Ereignis handelt, wird es implementiert, indem die ID in der switch-Anweisung angegeben wird.
CustomAdapter.java
class CustomAdapter extends BaseAdapter {
private LayoutInflater inflater;
private int resourcedId;
private String[] items;
static class ViewHolder {
Button editButton;
TextView textView;
Button deleteButton;
}
CustomAdapter(Context context, int resourcedId, String[] items) {
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.resourcedId = resourcedId;
this.items = items;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(resourcedId, parent, false);
holder = new ViewHolder();
holder.editButton = convertView.findViewById(R.id.edit);
holder.textView = convertView.findViewById(R.id.text);
holder.deleteButton = convertView.findViewById(R.id.delete);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(items[position]);
holder.editButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((ListView) parent).performItemClick(view, position, R.id.edit);
}
});
holder.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((ListView) parent).performItemClick(view, position, R.id.delete);
}
});
return convertView;
}
@Override
public int getCount() {
return items.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
}
row_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:text="Bearbeiten"/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="30dp"
android:layout_toEndOf="@+id/edit"/>
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:text="Löschen"/>
</RelativeLayout>
Im benutzerdefinierten Adapter wird der Teil, der in jeder Zeile angezeigt werden soll, von "findById" erfasst, der Text ist der Ländername von "setText ()", die Schaltfläche deckt "SetOnClickListener" mit "performeItemClick" ab und das Ereignis wird an die übergeordnete ListView gesendet. Diese Methode wird am meisten empfohlen, da sie relativ einfach ist und keinen anderen Code beeinträchtigt.
Was haben Sie gedacht? Es gibt verschiedene Möglichkeiten, die Ereignisse in der ListView abzurufen, aber die, die ich dieses Mal eingeführt habe, ist die einfachste, und ich denke, sie ist einfach einzuführen, da Sie den ursprünglichen Code nicht so stark ändern müssen. Außerdem ist der Ablauf nicht so kompliziert, daher war er meiner Meinung nach leicht zu verstehen.
Ich hoffe, es wird für alle hilfreich sein.
Recommended Posts