Я хочу удалить данные listView и появляется это исключение java .lang.NullPointerException - PullRequest
1 голос
/ 10 июля 2020

Ну делаю приложение в android. У меня есть listView для отображения данных моей Firebase, у этого listView есть строки с textView и кнопкой удаления, когда я хочу удалить определенные данные, я нажимаю кнопку удаления, но появляется эта ошибка java .lang.NullPointerException: попытка вызвать виртуальный метод void android .widget.TextView.setText (java .lang.CharSequence) для ссылки на нулевой объект

CustomAdapterData. java

public View getView(final int position, View convertView, ViewGroup parent) {
        Data data = new Data();
        if(convertView == null){
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            assert inflater != null;
            convertView = inflater.inflate(R.layout.list_data, null);
        }

        data.date = convertView.findViewById(R.id.date);
        data.age = convertView.findViewById(R.id.age);
        data.height = convertView.findViewById(R.id.height);
        data.weight = convertView.findViewById(R.id.weight);
        data.imc = convertView.findViewById(R.id.imc);

        data.date.setText(list.get(position).getDate());
        data.age.setText(list.get(position).getAge());
        data.height.setText(list.get(position).getHeight());
        data.weight.setText(list.get(position).getWeight());
        data.imc.setText(list.get(position).getImc());

        Button btDel = convertView.findViewById(R.id.btDelete);

        btDel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Data data = new Data();
                db.document(list.get(position).getDate())
                        .delete()
                        .addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Log.d("MainActivity", "DocumentSnapshot successfully deleted!");
                                Toast.makeText(context, "Data deleted", Toast.LENGTH_LONG).show();
                            }
                       })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.w("MainActivity", "Error deleting document", e);
                                Toast.makeText(context, "Data not deleted", Toast.LENGTH_LONG).show();
                            }
                        });
                list.remove(list.get(position));
                int pos = position;
                if (position == list.size()){
                    pos = position - 1;
                }
                data.date.setText(list.get(pos).getDate()); <- the error appears here
                data.age.setText(list.get(pos).getAge());
                data.height.setText(list.get(pos).getHeight());
                data.weight.setText(list.get(pos).getWeight());
                data.imc.setText(list.get(pos).getImc());
                Toast.makeText(context, "Data deleted", Toast.LENGTH_LONG).show();
            }
        });
        return convertView;
    }

https://github.com/epilif3sotnas/IMC

1 Ответ

0 голосов
/ 10 июля 2020

Вы создаете объект данных в onclick, который выбрасывает нулевой указатель. Я не сильно менял ваш код, чтобы вы могли понять, что изменилось в коде, но вам нужно инициализировать эти представления внутри if.

package com.example.imc;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;

import java.util.ArrayList;

public class CustomAdapterData extends BaseAdapter implements ListAdapter {
    private ArrayList<objData> list;
    private Context context;
    private CollectionReference db = FirebaseFirestore.getInstance().collection("user");

    private static class Data{
        TextView date;
        TextView age;
        TextView height;
        TextView weight;
        TextView imc;
    }
    public CustomAdapterData(ArrayList<objData> list, Context context){
        this.list = list;
        this.context = context;
    }
    @Override
    public int getCount() {
        return list.size();
    }
    @Override
    public Object getItem(int position) {
        return list.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @SuppressLint("InflateParams")
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
         final Data data ;



        if (convertView == null) { // if convertView is null
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = inflater.inflate(R.layout.list_data,
                    parent, false);
             data = new Data();
            data.date = convertView.findViewById(R.id.date);
            data.age = convertView.findViewById(R.id.age);
            data.height = convertView.findViewById(R.id.height);
            data.weight = convertView.findViewById(R.id.weight);
            data.imc = convertView.findViewById(R.id.imc);
            convertView.setTag(data);  // set tag on view
        } else {
            data = (Data) convertView.getTag();

        }


        final objData object = list.get(position);
        data.date.setText(object.getDate());
        data.age.setText(object.getAge());
        data.height.setText(object.getHeight());
        data.weight.setText(object.getWeight());
        data.imc.setText(object.getImc());

        Button btDel = convertView.findViewById(R.id.btDelete);

        btDel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Data data = new Data();
                db.document(object.getDate())
                        .delete()
                        .addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Log.d("MainActivity", "DocumentSnapshot successfully deleted!");
                                Toast.makeText(context, "Data deleted", Toast.LENGTH_LONG).show();
                                list.remove(position);
                                notifyDataSetChanged();
                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.w("MainActivity", "Error deleting document", e);
                                Toast.makeText(context, "Data not deleted", Toast.LENGTH_LONG).show();
                            }
                        });

               /* data.date.setText(object.getDate());
                data.age.setText(object.getAge());
                data.height.setText(object.getHeight());
                data.weight.setText(object.getWeight());
                data.imc.setText(object.getImc());*/
                Toast.makeText(context, "Atividade eliminada", Toast.LENGTH_LONG).show();
            }
        });
        return convertView;
    }
}
...