-4
I am 15 and  a starter in Android Studio, my app works fine but crashes every time i click the call button


This is my xml


  

    <LinearLayout
        android:layout_weight="8"
        android:layout_width="match_parent"
        android:padding="10dp"
        android:background="@drawable/recyclerview_bg"
        android:layout_height="0dp">
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/contactsRecycleView"
            android:layout_width="match_parent"
            android:layout_marginStart="3dp"
            android:layout_marginTop="3dp"
            android:layout_height="wrap_content"/>

    </LinearLayout>

</LinearLayout>

tHIS IS MY MAIN.JAVA, I CANT REALLY MAKE IT IVE BEEN DOING THIS FOR A WEEK

    private List<Contact> contacts;
    private RecyclerView recyclerView;
    private ContactAdapter adapter;

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

        init();

        setData();
    }

    public void setData() {
        contacts.add(new Contact("PNP", "092770",R.drawable.ic_baseline_account_circle_24));
        contacts.add(new Contact("Rescue Team ", "091567",R.drawable.ic_baseline_account_circle_24));
        contacts.add(new Contact("HAT", "097709",R.drawable.ic_baseline_account_circle_24));
        adapter.notifyDataSetChanged();
    }

    private void init() {
        contacts= new ArrayList<>();
        recyclerView=findViewById(R.id.contactsRecycleView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter=new ContactAdapter(contacts);
        recyclerView.setAdapter(adapter);
    }



}

this is my Recycler Adapter. I want to pass a data on my dialer cause i cant seem to do an ACTION_CALL, I came up with using an interface method but lost throughout the tutorial. so I just stick with passing the data on the dialer. I've researched but I cant really get it. I added THE call button on holder. Can someone explain it to me clearly. Ill really appreciate it.

    private List<Contact> contacts;
    Context context;



    public ContactAdapter(List<Contact> contacts) {

        this.contacts = contacts;

    }


    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.model_contact_design, parent, false);
        return  new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Contact contact = contacts.get(position);

        holder.nameTv.setText(contact.getName());
        holder.photoIv.setImageResource(contact.getPhoto());
        holder.phoneNo.setText(contact.getPhoneNo());


        holder.callIv.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                String phoneNo = contact.getPhoneNo();
                String call = "tel:" + phoneNo.trim();
                Intent intent = new Intent(Intent.ACTION_DIAL);
                intent.setData(Uri.parse(call));
                context.startActivity(intent);
            }



        });


    }
    @Override
    public int getItemCount() {

        return contacts.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private ImageView photoIv;
        ImageButton callIv;
        private TextView nameTv,phoneNo;
        Context context;



        public ViewHolder(@NonNull View itemView) {

            super(itemView);
            photoIv=itemView.findViewById(R.id.photoIV);
            callIv=itemView.findViewById(R.id.callIV);
            nameTv=itemView.findViewById(R.id.nameTV);
            phoneNo=itemView.findViewById(R.id.phoneNo);



        }


    }

}

tHIS IS MY LOGCATT:

    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.Context.startActivity(android.content.Intent)' on a null object reference
        at com.example.last.ContactAdapter$1.onClick(ContactAdapter.java:55)
        at android.view.View.performClick(View.java:7125)
        at android.view.View.performClickInternal(View.java:7102)
        at android.view.View.access$3500(View.java:801)
        at android.view.View$PerformClick.run(View.java:27336)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
klen
  • 1
  • 1
  • You never initialize `context` in `ContactAdapter`. Add a parameter to constructor and assign it. Pass `this` in when you instantiate it in `init`. –  Sep 25 '21 at 04:01

1 Answers1

0

Replace your ContactAdapter class with the code below.

public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.MyViewHolder> {

        private List<Contact> contacts;
        Context context;
    
    
    
        public ContactAdapter(Context context, List<Contact> contacts) {
    
            this.context = context;
            this.contacts = contacts;
    
        }
    
    
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(context).inflate(R.layout.model_contact_design, parent, false);
            return  new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            Contact contact = contacts.get(position);
    
            holder.nameTv.setText(contact.getName());
            holder.photoIv.setImageResource(contact.getPhoto());
            holder.phoneNo.setText(contact.getPhoneNo());
    
    
            holder.callIv.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                    String phoneNo = contact.getPhoneNo();
                    String call = "tel:" + phoneNo.trim();
                    Intent intent = new Intent(Intent.ACTION_DIAL);
                    intent.setData(Uri.parse(call));
                    context.startActivity(intent);
                }
    
    
    
            });
    
    
        }
        @Override
        public int getItemCount() {
    
            return contacts.size();
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder {
            private ImageView photoIv;
            ImageButton callIv;
            private TextView nameTv,phoneNo;
            Context context;
    
    
    
            public ViewHolder(@NonNull View itemView) {
    
                super(itemView);
                photoIv=itemView.findViewById(R.id.photoIV);
                callIv=itemView.findViewById(R.id.callIV);
                nameTv=itemView.findViewById(R.id.nameTV);
                phoneNo=itemView.findViewById(R.id.phoneNo);
    
    
    
            }
    
    
        }
    
    }

And replace your private void init() in MainJava class with the code below.

private void init() {
            contacts= new ArrayList<>();
            recyclerView=findViewById(R.id.contactsRecycleView);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            adapter=new ContactAdapter(this, contacts);
            recyclerView.setAdapter(adapter);
        }
Gedanggoreng
  • 186
  • 2
  • 11