【问题标题】:Adding to ArrayList from Adapter android从适配器android添加到ArrayList
【发布时间】:2016-04-09 21:15:29
【问题描述】:

我在 TabFragment1 类中有 ArrayList。我有已安装应用程序列表的适配器。当我单击 ImageView 应用程序名称和图标应该转到 TabFragment1 ArrayList,但我无法解决它。当我点击 iv 时,应用程序崩溃了。

应用适配器

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$1.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)

【问题讨论】:

    标签: android arraylist imageview onclicklistener custom-adapter


    【解决方案1】:

    您的 TabFragment1 类未在构造函数中初始化其成员之一:public List&lt;AddedApps&gt; data。因此,当您尝试执行 tab1.data.add(...) 时,您会遇到空引用,因为尚未调用 onCreateView() 并且 data 仍然为空。

    重写 TabFragment1 类中的构造函数并在那里初始化该成员。请记住调用 super 构造函数,以便 Fragment 类正常运行。

    【讨论】:

      【解决方案2】:

      对于回收站视图,您应该使用 RecyclerView.Adapter 并使用接口在您的活动中获取点击回调

      【讨论】:

      • 我有 2 个适配器:1 个用于回收站视图,1 个用于列表视图。我只想在listView适配器中拉数据并放入TabFragment1,然后recyclerView适配器在TabFragment1中拉数据并填充回收器视图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多