簡體   English   中英

如何在 CustomAdapter class 中調用新意圖?

[英]How to call a new intent in CustomAdapter class?

我是 Android Studios 的新手,我無法從我的 CustomAdapter class 調用新活動。 在應用程序中,用戶應該單擊 ListView 中的文本並打開一個顯示聯系人各自詳細信息的新活動。

that is located in MainActivity.java , and it takes in the parameters .我有一個名為的方法,它位於MainActivity.java中,它接受參數 in CustomAdapter.java .我在CustomAdapter.java中調用

that is located in MainActivity.java :位於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並調用

    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());

        }
    });

日志貓:

    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)

您不應該在 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);
    }
};

為了訪問activity中定義的接口,我們需要提供接口object給adapter。

我們可以為此使用 CustomAdapter 的構造函數。

private ICustomAdapterListener listener;

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

最后

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());
        }

    }
});

引發異常是因為您創建了MainActivity實例,而不是使用用於創建Adapter object 的context object。 請記住,這是創建 Activity 對象的操作系統。 您只需要求 Android OS 使用 Intents 為您創建活動。 我想您在適配器 class 中定義了 ViewHolder。 您可以使用以下方法更改代碼:

openContactDetail ,您不需要接收上下文 object:Activity 已經是一個上下文。 所以你可以重寫你的代碼:

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

考慮通過以下方式更改您的CustomAdapter定義:

public CustomAdapter(MainActivity mContext) {       
        this.mContext = mContext;
    }

    private MainActivity mContext;

    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(){

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

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

        }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM