Как вызвать новое намерение в классе CustomAdapter? - PullRequest
1 голос
/ 14 октября 2019

Я довольно новичок в Android Studios, и у меня возникают проблемы с вызовом нового действия из моего класса CustomAdapter. В приложении пользователь должен щелкнуть текст в ListView и открыть новое действие, в котором отображаются соответствующие сведения о контакте.

У меня есть метод с именем openContactDetails , расположенный в MainActivity.java , и он принимает параметры Контекст контекста, String currName, String currNumber . Я звоню openContactDetails in CustomAdapter.java .

openContactDetails , который находится в MainActivity.java :

    //...prior code

    public void openContactDetail(Context context, String currName, String currNumber){
        Intent intent = new Intent(context, ContactDetails.class);
        intent.putExtra("contactName", currName);
        intent.putExtra("contactPhone", currNumber);
        startActivity(intent);
    }

CustomAdapter.java и вызывается openContactDetails :

    private class ViewHolder{
        protected CheckBox checkBox;
        private TextView contactName;
    }

    public View getView(final int position, View convertView, ViewGroup parent){
        final ViewHolder holder;

        holder.checkBox = (CheckBox) convertView.findViewById(R.id.cb);
        holder.contactName = (TextView) convertView.findViewById(R.id.contact_name);

        holder.contactName.setOnClickListener(new View.OnClickListener(){

            MainActivity test = new MainActivity();

            @Override
            public void onClick(View v){
            //Toast.makeText(context, contactList.get(position).getName() + " selected at " + position, Toast.LENGTH_SHORT).show();

            test.openContactDetail(context,contactList.get(position).getName(), contactList.get(position).getNumber());

        }
    });

Logcat:

    10-13 16:54:02.195 10347-10347/com.example.testhw2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.testhw2, PID: 10347
java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
    at android.app.Activity.startActivityForResult(Activity.java:3918)
    at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
    at android.app.Activity.startActivityForResult(Activity.java:3877)
    at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
    at android.app.Activity.startActivity(Activity.java:4200)
    at android.app.Activity.startActivity(Activity.java:4168)
    at com.example.testhw2.MainActivity.openContactDetail(MainActivity.java:51)
    at com.example.testhw2.CustomAdapter$2.onClick(CustomAdapter.java:90)
    at android.view.View.performClick(View.java:5198)
    at android.view.View$PerformClick.run(View.java:21147)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

1 Ответ

3 голосов
/ 14 октября 2019

Вы не должны вызывать метод в MainActivity. Если вам нужен этот метод, вы можете использовать интерфейс для общения. Я сделал пример для вас. Сначала необходимо создать интерфейс.

public interface ICustomAdapterListener { 
  void openContactDetail(String currName, String currNumber);
}

, затем использовать его в действии.

ICustomAdapterListener customAdapterListener = new ICustomAdapterListener() {
    @Override
    public void openContactDetail(String currName, String currNumber) {
        Intent intent = new Intent(context, ContactDetails.class);
        intent.putExtra("contactName", currName);
        intent.putExtra("contactPhone", currNumber);
        startActivity(intent);
    }
};

Чтобы получить доступ к интерфейсу, определенному в действии, нам необходимо предоставить интерфейсобъект к адаптеру.

мы можем использовать конструктор CustomAdapter для этого.

private ICustomAdapterListener listener;

public CustomAdapter(ICustomAdapterListener listener) {
    this.listener = listener;
}

finally

public View getView(final int position, View convertView, ViewGroup parent){
    final ViewHolder holder;

    holder.checkBox = (CheckBox) convertView.findViewById(R.id.cb);
    holder.contactName = (TextView) convertView.findViewById(R.id.contact_name);

    holder.contactName.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
        //Toast.makeText(context, contactList.get(position).getName() + " selected at " + position, Toast.LENGTH_SHORT).show();
        if (listener!=nul) {
           listener.openContactDetail(contactList.get(position).getName(), contactList.get(position).getNumber());
        }

    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...