Comment ajouter un onclick à chaque bouton d'une liste, peuplé d'un adaptateur de tableau personnalisé, qui supprime cet élément du tableau et le met à jour ?

David Madurski

Je viens juste de commencer à apprendre Android, alors je m'excuse si je n'explique pas très bien ce que j'essaie de faire.

Donc, dans mon activité presetList, j'ai une liste de tableaux d'objets prédéfinis, et je remplis cette liste de tableaux avec les valeurs d'une base de données sqlite, qui est créée et définie dans son DBHelper correspondant. J'ai un presetAdapter qui utilise une vue personnalisée (un textView et un imageButton). Je configure les imageButtons pour qu'ils soient des icônes de suppression qui, lorsqu'on clique dessus, suppriment le textview correspondant de la base de données, remplissent la liste de tableaux avec les valeurs mises à jour, puis se mettent à jour, afin d'afficher la suppression de la valeur.

Je suis en mesure de supprimer correctement la valeur de la base de données, et afin de repeupler et d'actualiser la liste de tableaux et le presetAdapter, j'ai créé une méthode dans presetList appelée refreshList(). Cette méthode devrait gérer cette fonctionnalité, mais lorsque je l'appelle, elle lève une NullPointerException. Plus précisément, il plante lorsque j'essaie d'ouvrir un curseur pour lire les valeurs de ma base de données :

L'erreur:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.dmapp, PID: 5697
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDatabasePath(java.lang.String)' on a null object reference
        at android.content.ContextWrapper.getDatabasePath(ContextWrapper.java:327)
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:352)
        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:322)
        at com.example.dmapp.presetsDBHelper.getSpecificPresets(presetsDBHelper.java:93)
        at com.example.dmapp.PresetList.refreshList(PresetList.java:77)
        at com.example.dmapp.PresetAdapter$2.onClick(PresetAdapter.java:72)

Voici la liste des préréglages :

public class PresetList extends AppCompatActivity {

    MyRecyclerViewAdapter adapter;
    private PresetAdapter presetAdapter;
    private ArrayList<Preset> presetList = new ArrayList<>();
    String TAG = "PresetList";
    private String passedPresetVariable;
    private presetsDBHelper mPresetsDBHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.preset_list);
        setPassedPresetVariable(this.getIntent().getStringExtra("presetVariable"));
        Log.d(TAG, "onCreate: Passed Preset variable is " + getPassedPresetVariable());


        // data to populate the RecyclerView with

        mPresetsDBHelper = new presetsDBHelper(this);
        DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();
        int deviceHeight = (displayMetrics.heightPixels);

        Button addEntry = findViewById(R.id.addEntry);
        ListView presetListView = findViewById(R.id.presetListView);

        ViewGroup.LayoutParams params = presetListView.getLayoutParams();
        params.height = (int)(deviceHeight * .80);
        presetListView.setLayoutParams(params);

        // set up the RecyclerView with data from the database
        //Log.d(TAG, "onCreate: Preset variable is " + getIntent().getStringExtra("presetVariable"));
        Cursor presets = mPresetsDBHelper.getSpecificPresets(getIntent().getStringExtra("presetVariable"));
        try {
            if (presets.moveToNext()) {
                do {
                    presetList.add(new Preset(presets.getString(2)));
                } while (presets.moveToNext());
            }
        } finally {
            presets.close();
        }

        presetAdapter = new PresetAdapter(this, presetList);
        presetListView.setAdapter(presetAdapter);

        /*
        addEntry.setOnClickListener(new View.OnClickListener() {
            // The code in this method will be executed when the numbers View is clicked on.
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), CityInfo.class);
                startActivity(intent);
            }
        });
        */
    }

    public void refreshList(){
        mPresetsDBHelper = new presetsDBHelper(this);
        Log.d(TAG, "refreshList: Preset variable is " + getPassedPresetVariable());
        presetList.clear();
        Cursor presets = mPresetsDBHelper.getSpecificPresets("Environment"); //Didn't work with getPassedPresetVariable, attempted hardcoded value to test. Still not functional
        try {
            if (presets.moveToNext()) {
                do {
                    presetList.add(new Preset(presets.getString(2)));
                } while (presets.moveToNext());
            }
        } finally {
            presets.close();
        }
        presetAdapter.notifyDataSetChanged();
    }

    public void setPassedPresetVariable(String passedPresetVariable) {
        this.passedPresetVariable = passedPresetVariable;
    }

    public String getPassedPresetVariable() {
        return passedPresetVariable;
    }
}

Et voici mon adaptateur :

public class PresetAdapter extends ArrayAdapter<Preset> {

    private Context mContext;
    private List<Preset> presetList = new ArrayList<>();
    private PresetList presetListClass;
    String TAG = "PresetAdapter";

    public PresetAdapter(Context context, ArrayList<Preset> list) {
        super(context, 0 , list);
        mContext = context;
        presetList = list;
    }

    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View listItem = convertView;
        if(listItem == null) {
            listItem = LayoutInflater.from(mContext).inflate(R.layout.preset_item, parent, false);
        }

        Preset currentPreset = presetList.get(position);
        final TextView name = listItem.findViewById(R.id.presetValue);
        ImageButton delete = listItem.findViewById(R.id.deleteIcon);

        name.setText(currentPreset.getValue());
        name.setTag(position);
        name.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                int position = (Integer) view.getTag();
                // Access the row position here to get the correct data item
                Preset preset = getItem(position);
                // Do what you want here...
                String presetValue = preset.getValue();
                Intent intent = new Intent(name.getContext(), CityInfo.class);
                intent.putExtra("presetValue", presetValue);
                mContext.startActivity(intent);
            }
        });

        delete.setTag(position);
        delete.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                int position = (Integer) view.getTag();
                // Access the row position here to get the correct data item
                Preset preset = getItem(position);
                // Do what you want here...
                String presetValue = preset.getValue();
                presetsDBHelper mPresetsDBHelper = new presetsDBHelper(name.getContext());
                mPresetsDBHelper.removeSpecificPreset(presetValue);
                presetListClass = new PresetList();
                presetListClass.refreshList();
            }
        });

        return listItem;
    }
}

Je suppose qu'il y a un moyen plus simple de s'y prendre qui me manque, ou qu'il existe une solution plus simple. Si quelqu'un pouvait m'éclairer, ce serait très apprécié !

David Madurski

C'était donc beaucoup, beaucoup plus facile que je ne le pensais. Je passais déjà le arrayList dans le arrayAdapter, où je définissais les méthodes onClick. Tout ce que j'avais à faire était de migrer le code de la fonction refreshList() à l'intérieur du onClick dans le arrayAdapter etnotifyDataSetChanged();

La méthode onClick dans mon arrayAdapter ressemble maintenant à ceci :

delete.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                int position = (Integer) view.getTag();
                // Access the row position here to get the correct data item
                Preset preset = getItem(position);
                // Do what you want here...
                String presetValue = preset.getValue();
                presetsDBHelper mPresetsDBHelper = new presetsDBHelper(name.getContext());
                mPresetsDBHelper.removeSpecificPreset(presetValue);

                presetList.clear();
                Cursor presets = mPresetsDBHelper.getSpecificPresets("Environment"); //Didn't work with getPassedPresetVariable, attempted hardcoded value to test. Still not functional
                try {
                    if (presets.moveToNext()) {
                        do {
                            presetList.add(new Preset(presets.getString(2)));
                        } while (presets.moveToNext());
                    }
                } finally {
                    presets.close();
                }
                notifyDataSetChanged();

            }
        });

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Microsoft.WebApplication.targets

  2. 2

    Exporter la table de l'arborescence vers CSV avec mise en forme

  3. 3

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  4. 4

    Comment analyser un hachage Ruby plat en un hachage imbriqué?

  5. 5

    Passer la taille d'un tableau 2D à une fonction ?

  6. 6

    Comment créer une nouvelle application dans Dropbox avec des autorisations complètes

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Laravel SQLSTATE [HY000] [1049] Base de données inconnue 'previous_db_name'

  9. 9

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  10. 10

    php ajouter et fusionner des données de deux tables

  11. 11

    Créer un système Buzzer à l'aide de python

  12. 12

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  13. 13

    Comment changer la couleur de la police dans R?

  14. 14

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  15. 15

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  16. 16

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  17. 17

    comment afficher un bouton au-dessus d'un autre élément ?

  18. 18

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  19. 19

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  20. 20

    optimiser les opérations du serveur avec elasticsearch: traitement des filigranes de disque bas

  21. 21

    Comment analyser un fichier avec un tableau d'objets JSON en utilisant Node.js?

chaudétiquette

Archive