[JAVA] J'ai vu la liste du développement Android collectivement

introduction

Bonjour. Je suis Wataku, un programmeur côté serveur qui étudie la programmation dans une certaine école. : détendu: Développons également Android cette fois. Puisqu'il existe différentes façons d'afficher des vues de liste sur Android, je suis moi-même devenu confus, alors j'aimerais dormir avec le diable.

Personne cible

Principes de base de la vue Liste

Listeur d'écoute

○ Classe d'écouteur lorsque vous appuyez sur la vue de liste: ** onItemClickListener ** Implémentez l'interface. `` * Cette interface est une interface membre de la classe AdapterView '' ○ Méthode de paramétrage de la liste

setOnItemClickListener(Placez l'interface membre qui implémente onItemClickListener)

Obtenir l'élément tap

** 1) Gestionnaire d'événements: onItemClick () ** 4 arguments

1.AdapterView<?> parent 
->L'ensemble de ListView exploité

2.View view
->Une ligne de pièces d'écran taraudées

3.int position
->Numéro de ligne sur écoute
* À partir de 0

4.long id
->Valeur de clé primaire lorsque ListView est généré en fonction des données de base de données
* Si DB n'est pas utilisé, la même valeur que la position ci-dessus

** 2) Acquisition de données ** ○ Les données de la ligne tapée peuvent être obtenues en utilisant le parent et la position.

(String)parent.getItemAtPosition(position)

Exemple de code


private class ListItemClickListener implements AdapterView.OnItemClickListener {
    public void onItemClick(AdapterView<?> parent, View view, int position, long l) {
        String item = (String)parent.getItemAtPosition(position);
        Toast.makeText(ListClickSampleActivity.this, show, Toast.LENGTH_SHORT).show();
    }
}

Vue de liste statique

** 1) Créer avec xml **

activity_list_click_sample.xml


<?xml version="1.0" encoding="utf-8"?>
<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lvMenu"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:entries="@array/lv_menu"/>

string.xml


<?xml version="1.0" encoding="UTF-8" ?>
<resources>
    <string name="app_name">Échantillon de sélection de liste</string>
    <string-array name="lv_menu">
        <item>Poulet frit</item>
        <item>Repas de hamburger</item>
        <item>Repas grillé au gingembre</item>
        <item>Repas ensemble steak</item>
        <item>Repas de légumes sautés</item>
        <item>Repas de viande de pot de temps</item>
        <item>Repas Mao Tofu</item>
        <item>Repas de tonkatsu</item>
        <item>Ensemble de côtelettes hachées</item>
        <item>Poulet et plat</item>
        <item>Repas de croquettes</item>
        <item>Repas de poisson grillé</item>
        <item>Repas de viande grillée</item>
        <item>Viande faible et nourriture forte</item>
    </string-array>
</resources>

ListClickSampleActivity.java


public class ListClickSampleActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_click_sample);

        ListView lvMenu = findViewById(R.id.lvMenu);
        lvMenu.setOnItemClickListener(ListItemClickListener);

    }

    AdapterView.OnItemClickListener ListItemClickListener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long l) {
            String item = (String)parent.getItemAtPosition(position);
            String show = "Repas de votre choix:" + item;
            Toast.makeText(ListClickSampleActivity.this, show, Toast.LENGTH_SHORT).show();
        }
    };
}

** 2) Créer avec du code Java **

<?xml version="1.0" encoding="utf-8"?>
<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lvPref"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</ListView>

PrefListActivity.java


public class PrefListActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pref_list);

        ListView lvPref = findViewById(R.id.lvPref);

        List<String> prefList = createPrefectureList();
        ArrayAdapter<String> adapter = new ArrayAdapter<>(PrefListActivity.this, android.R.layout.simple_list_item_1, prefList);
        lvPref.setAdapter(adapter);

        lvPref.setOnItemClickListener(new ListItemClickListener());
    }

    /**
     *Une méthode pour générer une liste d'états.
     * @return Objet de liste d'état.
     */
    private List<String> createPrefectureList() {
        List<String> prefList = new ArrayList<>();
        prefList.add("Hokkaido");
        prefList.add("Préfecture d'Aomori");
        prefList.add("Préfecture d'Iwate");
        prefList.add("Préfecture de Miyagi");
        prefList.add("Akita");
        prefList.add("Préfecture de Yamagata");
        prefList.add("Préfecture de Fukushima");
        prefList.add("Préfecture d'Ibaraki");
        prefList.add("Préfecture de Tochigi");
        prefList.add("Préfecture de Gunma");
        prefList.add("Saitama");
        prefList.add("Préfecture de Chiba");
        prefList.add("Tokyo");
        prefList.add("Préfecture de Kanagawa");
        prefList.add("Préfecture de Niigata");
        prefList.add("Préfecture de Toyama");
        prefList.add("Préfecture d'Ishikawa");
        prefList.add("Préfecture de Fukui");
        prefList.add("Préfecture de Yamanashi");
        prefList.add("Préfecture de Nagano");
        prefList.add("Préfecture de Gifu");
        prefList.add("Préfecture de Shizuoka");
        prefList.add("Préfecture d'Aichi");
        prefList.add("Préfecture de Mie");
        prefList.add("Préfecture de Shiga");
        prefList.add("Kyoto");
        prefList.add("Préfecture d'Osaka");
        prefList.add("Préfecture de Hyogo");
        prefList.add("Préfecture de Nara");
        prefList.add("Préfecture de Wakayama");
        prefList.add("Préfecture de Tottori");
        prefList.add("Préfecture de Shimane");
        prefList.add("Préfecture d'Okayama");
        prefList.add("Préfecture d'Hiroshima");
        prefList.add("Préfecture de Yamaguchi");
        prefList.add("Préfecture de Tokushima");
        prefList.add("Préfecture de Kagawa");
        prefList.add("Préfecture d'Ehime");
        prefList.add("Préfecture de Kochi");
        prefList.add("Préfecture de Fukuoka");
        prefList.add("Préfecture de Saga");
        prefList.add("Préfecture de Nagasaki");
        prefList.add("Préfecture de Kumamoto");
        prefList.add("Préfecture d'Oita");
        prefList.add("Préfecture de Miyazaki");
        prefList.add("Préfecture de Kagoshima");
        prefList.add("Préfecture d'Okinawa");
        return prefList;
    }

    /**
     *Une classe membre qui décrit ce qui se passe lorsqu'une liste est sélectionnée.
     *Transférez le processus sur le deuxième écran.
     */
    private class ListItemClickListener implements AdapterView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String prefName = (String) parent.getItemAtPosition(position);

            Intent intent = new Intent(PrefListActivity.this, PrefEditActivity.class);
            intent.putExtra("selectedPrefNo", position);
            intent.putExtra("selectedPrefName", prefName);
            startActivity(intent);
        }
    }
}

Vue de liste dynamique

Utilisez la classe ** SimpleCursorAdapter **. → À utiliser lorsque vous souhaitez créer une vue de liste basée sur les données du DB. 6 arguments

1.le contexte

2.Valeur R représentant la disposition de chaque ligne dans la vue liste
*simple_list_view_item_1 est généralement bon.

3.Objet curseur

4.String[] :Tableau de noms de colonnes

5.int[] :Disposition des valeurs R des parties d'écran

6.0 c'est bien

Comment afficher (enregistrer) ceci dans la vue de liste -> Utilisez la méthode ** setAdapter ** de la classe ListView

Exemple de code

MemoListActivity.java


public class MemoListActivity extends AppCompatActivity {
    private ListView _lvMemoList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_memo_list);

        _lvMemoList = findViewById(R.id.lvMemoList);
        _lvMemoList.setOnItemClickListener(new ListItemClickListener());
    }

    @Override
    protected void onResume() {
        super.onResume();
        DatabaseHelper helper = new DatabaseHelper(MemoListActivity.this);
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor cursor = DataAccess.findAll(db);
        String[] from = {"title"};
        int[] to = {android.R.id.text1};
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(MemoListActivity.this, android.R.layout.simple_list_item_1, cursor, from, to, 0);
        _lvMemoList.setAdapter(adapter);
    }
}

`ʻOnResume: Méthode pour rafraîchir l'écran``

Personnaliser la liste

Utilisez ** SimpleAdapter **. row Pour personnaliser chaque ligne de la vue de liste, procédez comme suit: ** 1) Préparez un fichier de mise en page .xml pour une ligne ** -> Comment écrire un fichier xml est le même qu'un fichier de mise en page normal

res/layout/row.xml


<LinearLayout ... >
    <ImageView ... />
    <TextView ... /> 
    <TextView ... /> 
    <TextView ... />
</LinearLayout>

`` * Le nom de fichier peut être n'importe quoi ''

** 2) Spécifiez la valeur R du fichier en 1) dans l'argument qui spécifie la disposition lors de la création de l'adaptateur. ** **

(ex.)
new.SimpleAdapter( ..., _list, R.layout.row, ... );

** 3) Dans le tableau int de l'argument to lors de la création de la classe d'adaptateur, spécifiez la valeur R de id décrite dans le fichier de 1). ** **

(ex.)
int[] to = {R.id.tvMenuName, R.id.tvMenuPrice}

ViewBinder ** (1) Qu'est-ce que ViewBinder ** Vous pouvez utiliser `` row.xml pour personnaliser la mise en page qui précède la vue de liste. ''

Alors, comment changer le contenu d'affichage de chaque ligne en fonction des données?

Créez votre propre processus pour attribuer des données à des parties d'écran en combinant de à (création de ViewBinder), la procédure est la suivante.

** 1) Créez une classe qui implémente l'interface SimpleAdapter.ViewBinder. -> La classe de membre privé est bien **

** 2) Décrivez le processus d'allocation de données pour filtrer des parties dans la méthode setViewValue () de cette classe. (Voir ci-dessous) **

** 3) Passez une nouvelle version de cette classe à la méthode setViewBinder () de la classe adaptateur **

(ex.) 
private class CustomViewBinder implement SimpleAdapter.ViewBinder {
    @Override
    public boolean setViewValue() { 

Décrivez ici la répartition des données des parties d'écran dans chaque ligne
    }  
}

adapter.setViewBinder(new CustomViewBinder());

** (2) Argument de setViewValue () ** Les arguments de la méthode setViewValue () sont les trois suivants.

1. View view :Filtrer les pièces sur une seule ligne.
2. Object data :Les données à affecter au premier argument ci-dessus.
3. String textReprosentation :Une chaîne du contenu du deuxième argument. Si le deuxième argument est nul
Chaîne vide.

** (3) Modèle de traitement dans setViewValue () ** À l'intérieur de setViewValue (), branchez en utilisant l'id de la vue d'argument et décrivez le processus en utilisant les données d'argument. → L'instruction switch est pratique.

public booelan setViewValue ( .... ) {
  int viewId = view.getId();← Obtenir l'identifiant
  switch( viewId ) {← Traitement des branches selon id(switch)
    case R . id . imPhoneType :← Valeur R car c'est une comparaison entre les identifiants
      ImageView imPhoneType = ( ImageView ) view;
      int phoneType = ( Integer ) data;

Alors fais ce que tu veux.

      return true;     
    case .....
  }
  return false
}

Dans la méthode `` setViewValue (), décrivez le processus d'origine d'incorporation de données dans la vue, c'est-à-dire, décrivez return true à la fin de chaque cas. De plus, écrivez return false à la fin de la méthode. → Sur la base de cette valeur de retour, il est déterminé s'il faut incorporer ou non les données côté OS. ''

** (4) Pour SimpleCursorAdapter ** Même dans le cas de SimpleCursorAdapter, le traitement de setViewValue () de ViewBinder est le même que celui de SimpleAdapter.

view . getId()Branchez la valeur de avec un commutateur. Cependant, les arguments sont les trois suivants.
1. View view :Filtrer les parties sur une ligne de la liste.
2. Cursor cursor :Un objet curseur qui contient des données pour une ligne de la liste cible.
3. int columnIndex :L'index de colonne des données à affecter au premier argument ci-dessus.

Rechargement des données DB

Lorsque les données du DB qui sont les données d'origine de la vue de liste sont mises à jour, il est nécessaire de récupérer les données du DB et de les afficher à nouveau.

○ Le code source suivant.
SimpleCursorAdapter adapter = ( SimpleCursorAdapter ) _lvPhones . getAdapter();

adapter . changeCursor( cursor );← Échangez le curseur. Nouveau curseur

(Remarque) Si vous voulez définir l'adaptateur avec `ʻonCreate () et définir (remplacer) le curseur par onResume (), vous pouvez passer null au curseur d'argument lorsque vous créez SimpleCursorAdapter dans onCreate (). ''

Exemple de code 1

public class CustomizedListView2Activity extends AppCompatActivity {
    /**
     *Données de liste à afficher dans la vue de liste.
     */
    private List<Map<String, Object>> _list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_customized_list_view2);

        _list = createList();

        String[] from = {"phoneType", "phoneNo", "phoneSex"};
        int[] to = {R.id.imPhoneType, R.id.tvPhoneNo, R.id.tvSex};
        SimpleAdapter adapter = new SimpleAdapter(CustomizedListView2Activity.this, _list, R.layout.row, from, to);
        adapter.setViewBinder(new CustomViewBinder());
        ListView lvPhones = findViewById(R.id.lvPhones);
        lvPhones.setAdapter(adapter);
    }

    /**
     *Une méthode qui génère les données de liste affichées dans la vue de liste.
     *
     * @return Les données de liste générées.
     */
    private List<Map<String, Object>> createList() {
        List<Map<String, Object>> list = new ArrayList<>();

        for (int i = 1; i <= 30; i++) {
            int phoneType = (int) (3 * Math.random()) + 1;
            int phoneNoInt = (int) (99999999 * Math.random());
            int phoneSexInt = (int) (10*Math.random() + 1);

            String phoneNo = "090" + String.format("%08d", phoneNoInt);

            int phoneSex = 1;
            if(phoneSexInt <= 5) {
                phoneSex = 0;
            }

            Map<String, Object> map = new HashMap<>();
            map.put("phoneType", phoneType);
            map.put("phoneNo", phoneNo);
            map.put("phoneSex", phoneSex);
            list.add(map);
        }

        return list;
    }

    /**
     *Classe de classeur de vue personnalisée de vue de liste.
     */
    private class CustomViewBinder implements SimpleAdapter.ViewBinder {

        @Override
        public boolean setViewValue(View view, Object data, String textRepresentation) {
            int viewId = view.getId();
            switch(viewId) {
                case R.id.imPhoneType:
                    ImageView imPhoneType = (ImageView) view;
                    int phoneType = (Integer) data;
                    switch(phoneType) {
                        case 2:
                            imPhoneType.setImageResource(android.R.drawable.ic_menu_crop);
                            break;
                        case 3:
                            imPhoneType.setImageResource(android.R.drawable.ic_menu_myplaces);
                            break;
                        default:
                            imPhoneType.setImageResource(android.R.drawable.ic_menu_call);
                            break;
                    }
                    return true;
                case R.id.tvPhoneNo:
                    TextView tvPhoneNo = (TextView) view;
                    String phoneNo = (String) data;
                    tvPhoneNo.setText(phoneNo);
                    return true;
                case R.id.tvSex:
                    TextView tvSex = (TextView) view;
                    int phoneSex = (Integer) data;
                    String sex = "♂";
                    if(phoneSex == 0) {
                        sex = "♀";
                    }
                    tvSex.setText(sex);
                    return true;
            }
            return false;
        }
    }
}

Exemple de code 2

public class CustomizedListView3Activity extends AppCompatActivity {
    
    private ListView _lvPhones;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_customized_list_view3);
        _lvPhones = findViewById(R.id.lvPhones);

        String[] from = {"phone_type", "phone_no", "phone_sex"};
        int[] to = {R.id.imPhoneType, R.id.tvPhoneNo, R.id.tvSex};
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(CustomizedListView3Activity.this, R.layout.row, null, from, to, 0);
        adapter.setViewBinder(new CustomViewBinder());
        _lvPhones.setAdapter(adapter);
    }

    @Override
    public void onResume() {
        super.onResume();
        setNewCursor();
    }

    /**
     *Une méthode pour mettre à jour le curseur dans l'adaptateur de curseur.
     */
    private void setNewCursor() {
        DatabaseHelper helper = new DatabaseHelper(CustomizedListView3Activity.this);
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor cursor = DataAccess.findAll(db);
        SimpleCursorAdapter adapter = (SimpleCursorAdapter) _lvPhones.getAdapter();
        adapter.changeCursor(cursor);
    }

    /**
     *Classe de classeur de vue personnalisée de vue de liste.
     *
     * @author Shinzo SAITO
     */
    private class CustomViewBinder implements SimpleCursorAdapter.ViewBinder {

        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            int viewId = view.getId();
            switch(viewId) {
                case R.id.imPhoneType:
                    ImageView imPhoneType = (ImageView) view;
                    int phoneType = cursor.getInt(columnIndex);
                    switch(phoneType) {
                        case 2:
                            imPhoneType.setImageResource(android.R.drawable.ic_menu_crop);
                            break;
                        case 3:
                            imPhoneType.setImageResource(android.R.drawable.ic_menu_myplaces);
                            break;
                        default:
                            imPhoneType.setImageResource(android.R.drawable.ic_menu_call);
                            break;
                    }
                    return true;
                case R.id.tvPhoneNo:
                    TextView tvPhoneNo = (TextView) view;
                    String phoneNo = cursor.getString(columnIndex);
                    tvPhoneNo.setText(phoneNo);
                    return true;
                case R.id.tvSex:
                    TextView tvSex = (TextView) view;
                    int phoneSex = cursor.getInt(columnIndex);
                    String sex = "♂";
                    if(phoneSex == 0) {
                        sex = "♀";
                    }
                    tvSex.setText(sex);
                    return true;
            }
            return false;
        }
    }
}

c'est tout. J'ai résumé la vue de liste sur Android. Si vous avez des suggestions telles que quelque chose qui ne va pas, veuillez nous contacter. Merci d'avoir lu jusqu'au bout.

Recommended Posts

J'ai vu la liste du développement Android collectivement
À propos des bases du développement Android
<Android> Changer la couleur d'arrière-plan de la ligne Liste de ListView
Personnaliser la vue de liste sur Android
Je vais expliquer la différence entre le développement d'applications Android et le développement d'applications iOS du point de vue des ingénieurs iOS
[Java] Supprimer les éléments de la liste
Un nouveau venu tente de résumer la vue Android (développement d'applications Android pour débutants)
J'ai lu la source de ArrayList que j'ai lu
J'ai ouvert la barre de menu (menu d'options) sur Android et l'ai vue.
J'ai lu la source d'Integer
J'ai lu la source de Long
J'ai lu la source de Short
J'ai lu la source de Byte
J'ai lu la source de String
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
Développement Android, comment vérifier null dans la valeur de l'objet JSON
Comprendre les bases de l'enregistrement audio Android
J'ai étudié le traitement interne de Retrofit
[jour: 5] J'ai résumé les bases de Java
Comment trier une liste de SelectItems
Correction de l'écran de visualisation de la page de publication
Vue Android
Résumer le cycle de vie des objets Java à prendre en compte dans le développement Android
[N ° 004] Correction de l'écran de la liste des commandes du client
JAVA: jar, aar, affichez le contenu du fichier
[Android] [Java] Gérer l'état de CheckBox de ListView
J'ai vérifié la partie de java.net.URL # getPath
[Android] Liste tous les éléments de réglage sur l'écran de réglage
J'ai compris les bases de la saisie de caractères
Parcourir une instance de Tab's View sur Android
Améliorer les performances de l'environnement de développement Docker
J'ai comparé les caractéristiques de Java et .NET
L'histoire du réglage de l'application Android avec libGDX
Je veux var_dump le contenu de l'intention
Développement d'Android Studio pour la première fois (pour les débutants)
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
J'ai vérifié le nombre de taxis avec Ruby
Essayez Progate Free Edition [Java I]
Notez que j'étais accro aux paramètres du projet Android d'IntelliJ IDEA
Analyse statistique simple du montant monétaire à partir de la liste recherchée par le développement Mercari Java