[英]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.