Si vous développez une application Android, vous rencontrerez certainement "L'enfer d'un ListView mordant un adaptateur personnalisé"
Cela ne serait pas possible une fois mis en œuvre. Cette fois, j'aimerais aller plus loin et mettre un Button dans le ListView.
N'y a-t-il pas beaucoup de situations comme celle-ci? CheckBox, modifier ou supprimer le bouton.
Cette fois, j'aimerais faire de mon mieux pour créer l'interface utilisateur ci-dessous. C'est un substitut à un mémo personnel.
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] + "Le bouton Modifier a été enfoncé", Toast.LENGTH_SHORT).show();
break;
case R.id.delete:
Toast.makeText(MainActivity.this, countries[position] + "Le bouton de suppression a été enfoncé", 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>
Cette fois, seul ListView est préparé pour MainActivity. Nous configurons un ListView personnalisé qui affiche le texte avec deux boutons en mordant le ListView avec l'adaptateur personnalisé présenté ci-dessous.
La mise en garde ici est de donner à ListView un SetOnItemClickListener
pour obtenir l'événement de clic du côté de l'adaptateur. N'oubliez pas ...
Pour déterminer le bouton de l'événement acquis, il est implémenté en spécifiant l'id dans l'instruction switch.
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="Éditer"/>
<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="Effacer"/>
</RelativeLayout>
Dans l'adaptateur personnalisé, la partie à afficher dans chaque ligne est acquise par findById
, le texte est le nom du pays par setText ()
, le bouton couvre SetOnClickListener
avec performeItemClick
, et l'événement est envoyé au ListView parent. Cette méthode est la plus recommandée car elle est relativement simple et n'interfère pas avec d'autres codes.
Qu'as-tu pensé? Il existe différentes façons d'obtenir les événements dans ListView, mais celui que j'ai présenté cette fois est le plus simple, et je pense qu'il est facile à introduire car vous n'avez pas à modifier autant le code d'origine. De plus, le flux n'est pas si compliqué, donc je pense que c'était facile à comprendre.
J'espère que cela sera utile à tout le monde.
Recommended Posts