在其他数组适配器中实例化数组适配器时,我得到 null
when instantiating array adapter in other array adapter I'm getting null
我需要将列表项从 ListAdapterA onClick 方法添加到 DoneListAdapter 所以我需要实例化 DoneListAdapter 在 ListAdapterA 中调用添加列表项的方法 add 和 notifyDataSetChanged() 但是 DoneListAdapter returns null 并且我的应用程序崩溃了,为什么 returns 为空?
public class ListAdapterA extends ArrayAdapter<Abc> {
private Context context;
private String testString = "a";
DoneListAdapter doneListAdapter;
List<Abc> abc;
List<DoneAbc> doneAbc;
public ListAdapter(Context context, List<Abc> cbA) {
super(context, R.layout.list_item, cbA);
this.context = context;
this.abc = cbA;
doneListAdapter = new DoneListAdapter(context,doneAbc);
doneActionHandler = new DoneActionHandler(context);
actionHandler = new ActionHandler(context);
}
private class ViewHolder {
ImageButton abcDoneBtn;
}
@Override
public Abc getItem(int position) {
return abc.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return (testString == "a") ? 0:1;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if (convertView == null) {
if (type == 0){
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item_finished, null);
}else {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, null);
}
holder = new ViewHolder();
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (type == 0){
holder.abcDoneBtn= (ImageButton)convertView.findViewById(R.id.finished_abc);
holder.abcDoneBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Abc abc = (Abc) getItem(position);
DoneABC doneabc = new DoneAC();
DoneABC.setId(abc.getId());
doneabc.setName(abc.getName());
doneActionHandler.save(doneabc);
doneListAdapter.add(doneabc);
remove(abc);
actionHandler.delete(abc);
notifyDataSetChanged();
doneListAdapter.notifyDataSetChanged();
}
});
}
return convertView;
}
@Override
public void add(Abc abc) {
dreams.add(abc);
notifyDataSetChanged();
super.add(abc);
}
@Override
public void remove(Abc abc) {
dreams.remove(abc);
notifyDataSetChanged();
super.remove(abc);
}
}
完成适配器:
public class DoneListAdapter extends ArrayAdapter<DoneAbc> {
private Context context;
List<DoneAbc> adoneAbc;
public DoneListAdapter(Context context, List<DoneAbc> doneAbc) {
super(context, R.layout.list_item, doneAbc);
this.context = context;
this.adoneAbc = doneAbc;
}
private class ViewHolder {
}
@Override
public int getCount() {
return adoneAbc.size();
}
@Override
public DoneAbc getItem(int position) {
return adoneAbc.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
@Override
public void add(DoneAbc doneAbc) {
adoneAbc.add(doneAbc);
notifyDataSetChanged();
super.add(doneAbc);
}
@Override
public void remove(DoneAbc doneAbc) {
adoneAbc.remove(doneAbc);
notifyDataSetChanged();
super.remove(doneAbc);
}
}
FATAL EXCEPTION: main
Process: com.teamkosas.cloudv05, PID: 30693
java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
at com.teamkosas.cloudv05.adapters.DoneListAdapter.add(DoneListAdapter.java:123)
at com.teamkosas.cloudv05.adapters.ListAdapterA.onClick(ListAdapterA.java:152)
at android.view.View.performClick(View.java:5697)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
您正在 DoneListAdapter
构造函数中传递空列表。
在您的 class ListAdapterA
中替换此行:
doneListAdapter = new DoneListAdapter(context,doneAbc);
有了这个:
doneListAdapter = new DoneListAdapter(context,new ArrayList<DoneAbc>())
我需要将列表项从 ListAdapterA onClick 方法添加到 DoneListAdapter 所以我需要实例化 DoneListAdapter 在 ListAdapterA 中调用添加列表项的方法 add 和 notifyDataSetChanged() 但是 DoneListAdapter returns null 并且我的应用程序崩溃了,为什么 returns 为空?
public class ListAdapterA extends ArrayAdapter<Abc> {
private Context context;
private String testString = "a";
DoneListAdapter doneListAdapter;
List<Abc> abc;
List<DoneAbc> doneAbc;
public ListAdapter(Context context, List<Abc> cbA) {
super(context, R.layout.list_item, cbA);
this.context = context;
this.abc = cbA;
doneListAdapter = new DoneListAdapter(context,doneAbc);
doneActionHandler = new DoneActionHandler(context);
actionHandler = new ActionHandler(context);
}
private class ViewHolder {
ImageButton abcDoneBtn;
}
@Override
public Abc getItem(int position) {
return abc.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return (testString == "a") ? 0:1;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if (convertView == null) {
if (type == 0){
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item_finished, null);
}else {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, null);
}
holder = new ViewHolder();
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (type == 0){
holder.abcDoneBtn= (ImageButton)convertView.findViewById(R.id.finished_abc);
holder.abcDoneBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Abc abc = (Abc) getItem(position);
DoneABC doneabc = new DoneAC();
DoneABC.setId(abc.getId());
doneabc.setName(abc.getName());
doneActionHandler.save(doneabc);
doneListAdapter.add(doneabc);
remove(abc);
actionHandler.delete(abc);
notifyDataSetChanged();
doneListAdapter.notifyDataSetChanged();
}
});
}
return convertView;
}
@Override
public void add(Abc abc) {
dreams.add(abc);
notifyDataSetChanged();
super.add(abc);
}
@Override
public void remove(Abc abc) {
dreams.remove(abc);
notifyDataSetChanged();
super.remove(abc);
}
}
完成适配器:
public class DoneListAdapter extends ArrayAdapter<DoneAbc> {
private Context context;
List<DoneAbc> adoneAbc;
public DoneListAdapter(Context context, List<DoneAbc> doneAbc) {
super(context, R.layout.list_item, doneAbc);
this.context = context;
this.adoneAbc = doneAbc;
}
private class ViewHolder {
}
@Override
public int getCount() {
return adoneAbc.size();
}
@Override
public DoneAbc getItem(int position) {
return adoneAbc.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
@Override
public void add(DoneAbc doneAbc) {
adoneAbc.add(doneAbc);
notifyDataSetChanged();
super.add(doneAbc);
}
@Override
public void remove(DoneAbc doneAbc) {
adoneAbc.remove(doneAbc);
notifyDataSetChanged();
super.remove(doneAbc);
}
}
FATAL EXCEPTION: main Process: com.teamkosas.cloudv05, PID: 30693 java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference at com.teamkosas.cloudv05.adapters.DoneListAdapter.add(DoneListAdapter.java:123) at com.teamkosas.cloudv05.adapters.ListAdapterA.onClick(ListAdapterA.java:152) at android.view.View.performClick(View.java:5697) at android.view.View$PerformClick.run(View.java:22526) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7224) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
您正在 DoneListAdapter
构造函数中传递空列表。
在您的 class ListAdapterA
中替换此行:
doneListAdapter = new DoneListAdapter(context,doneAbc);
有了这个:
doneListAdapter = new DoneListAdapter(context,new ArrayList<DoneAbc>())