从适配器添加到 ArrayList android
Adding to ArrayList from Adapter android
我在 class TabFragment1 中有 ArrayList。我有已安装应用程序列表的适配器。当我单击 ImageView 应用程序名称和图标时,应该转到 TabFragment1 ArrayList,但我无法解析它。单击 iv 时应用程序崩溃。
AppAdapter
public class AppAdapter extends BaseAdapter{
private List<ApplicationInfo> packages;
private LayoutInflater inflater;
private PackageManager pm;
public AppAdapter(Context context, PackageManager pm, List<ApplicationInfo> packages) {
this.packages = packages;
this.pm = pm;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return packages.size();
}
@Override
public ApplicationInfo getItem(int p1) {
return packages.get(p1);
}
@Override
public long getItemId(int p1) {
return p1;
}
@Override
public View getView(int position, View v, ViewGroup parent) {
View view = null;
final ViewHolder viewHolder;
final TabFragment1 tab1;
if (v == null) {
viewHolder = new ViewHolder();
view = inflater.inflate(R.layout.list_item, parent, false);
viewHolder.tvAppLabel = (TextView) view
.findViewById(R.id.app_item_text);
viewHolder.ivAppIcon = (ImageView) view
.findViewById(R.id.app_item_image);
viewHolder.ivAppAdd = (ImageView) view
.findViewById(R.id.add);
view.setTag(viewHolder);
} else {
view = v;
viewHolder = (ViewHolder) view.getTag();
}
ApplicationInfo app = packages.get(position);
tab1= new TabFragment1();
viewHolder.tvAppLabel.setText(app.loadLabel(pm).toString());
viewHolder.ivAppIcon.setImageDrawable(app.loadIcon(pm));
viewHolder.ivAppAdd.setImageResource(R.drawable.ic_add_circle_outline_black_48dp);
viewHolder.ivAppAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tab1.data.add(new AddedApps(viewHolder.ivAppIcon.getId(),
viewHolder.tvAppLabel.getText().toString())); //trouble is here
}
});
return view;
}
static class ViewHolder {
private TextView tvAppLabel;
private ImageView ivAppIcon;
private ImageView ivAppAdd;
}
}
TabFragment1
public class TabFragment1 extends Fragment {
private RecyclerView rv;
private FloatingActionButton fab;
private Fragment installedApps;
private FragmentTransaction transaction;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;
public List<AddedApps> data;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_fragment1, container, false);
rv=(RecyclerView) view.findViewById(R.id.recyclerView);
fab=(FloatingActionButton) view.findViewById(R.id.fabBtn);
installedApps = new InstalledApps();
data=new ArrayList<AddedApps>();
data.add(new AddedApps( R.mipmap.ic_launcher,"Application"));
layoutManager = new LinearLayoutManager(getContext());
rv.setLayoutManager(layoutManager);
adapter = new AddedAppsAdapter(data);
rv.setAdapter(adapter);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container, installedApps);
transaction.addToBackStack(null);
transaction
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
}
});
return view;
}
}
添加的应用程序
public class AddedApps {
private int icon;
private String name;
public AddedApps(int icon, String name) {
this.icon = icon;
this.name = name;
}
public int getIcon() {
return icon;
}
public String getName() {
return name;
}
}
崩溃日志:
java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
at com.kostya.newconcept.adapters.AppAdapter.onClick(AppAdapter.java:84)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
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)
对于回收站视图,您应该使用 RecyclerView.Adapter<> 并使用界面在 activity
中获取点击回调
您的 TabFragment1 class 未在构造函数中初始化其成员之一:public List<AddedApps> data
。因此,当您尝试执行 tab1.data.add(...)
时,您遇到了空引用,因为 onCreateView()
尚未被调用并且 data
仍为空。
覆盖 TabFragment1 class 中的构造函数并在那里初始化该成员。请记住调用 super
构造函数,以便 Fragment class 正常运行。
我在 class TabFragment1 中有 ArrayList。我有已安装应用程序列表的适配器。当我单击 ImageView 应用程序名称和图标时,应该转到 TabFragment1 ArrayList,但我无法解析它。单击 iv 时应用程序崩溃。
AppAdapter
public class AppAdapter extends BaseAdapter{
private List<ApplicationInfo> packages;
private LayoutInflater inflater;
private PackageManager pm;
public AppAdapter(Context context, PackageManager pm, List<ApplicationInfo> packages) {
this.packages = packages;
this.pm = pm;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return packages.size();
}
@Override
public ApplicationInfo getItem(int p1) {
return packages.get(p1);
}
@Override
public long getItemId(int p1) {
return p1;
}
@Override
public View getView(int position, View v, ViewGroup parent) {
View view = null;
final ViewHolder viewHolder;
final TabFragment1 tab1;
if (v == null) {
viewHolder = new ViewHolder();
view = inflater.inflate(R.layout.list_item, parent, false);
viewHolder.tvAppLabel = (TextView) view
.findViewById(R.id.app_item_text);
viewHolder.ivAppIcon = (ImageView) view
.findViewById(R.id.app_item_image);
viewHolder.ivAppAdd = (ImageView) view
.findViewById(R.id.add);
view.setTag(viewHolder);
} else {
view = v;
viewHolder = (ViewHolder) view.getTag();
}
ApplicationInfo app = packages.get(position);
tab1= new TabFragment1();
viewHolder.tvAppLabel.setText(app.loadLabel(pm).toString());
viewHolder.ivAppIcon.setImageDrawable(app.loadIcon(pm));
viewHolder.ivAppAdd.setImageResource(R.drawable.ic_add_circle_outline_black_48dp);
viewHolder.ivAppAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tab1.data.add(new AddedApps(viewHolder.ivAppIcon.getId(),
viewHolder.tvAppLabel.getText().toString())); //trouble is here
}
});
return view;
}
static class ViewHolder {
private TextView tvAppLabel;
private ImageView ivAppIcon;
private ImageView ivAppAdd;
}
}
TabFragment1
public class TabFragment1 extends Fragment {
private RecyclerView rv;
private FloatingActionButton fab;
private Fragment installedApps;
private FragmentTransaction transaction;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;
public List<AddedApps> data;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_fragment1, container, false);
rv=(RecyclerView) view.findViewById(R.id.recyclerView);
fab=(FloatingActionButton) view.findViewById(R.id.fabBtn);
installedApps = new InstalledApps();
data=new ArrayList<AddedApps>();
data.add(new AddedApps( R.mipmap.ic_launcher,"Application"));
layoutManager = new LinearLayoutManager(getContext());
rv.setLayoutManager(layoutManager);
adapter = new AddedAppsAdapter(data);
rv.setAdapter(adapter);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container, installedApps);
transaction.addToBackStack(null);
transaction
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
}
});
return view;
}
}
添加的应用程序
public class AddedApps {
private int icon;
private String name;
public AddedApps(int icon, String name) {
this.icon = icon;
this.name = name;
}
public int getIcon() {
return icon;
}
public String getName() {
return name;
}
}
崩溃日志:
java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
at com.kostya.newconcept.adapters.AppAdapter.onClick(AppAdapter.java:84)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
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)
对于回收站视图,您应该使用 RecyclerView.Adapter<> 并使用界面在 activity
中获取点击回调您的 TabFragment1 class 未在构造函数中初始化其成员之一:public List<AddedApps> data
。因此,当您尝试执行 tab1.data.add(...)
时,您遇到了空引用,因为 onCreateView()
尚未被调用并且 data
仍为空。
覆盖 TabFragment1 class 中的构造函数并在那里初始化该成员。请记住调用 super
构造函数,以便 Fragment class 正常运行。