0

Ich habe ArrayList in der Klasse TabFragment1. Ich habe einen Adapter für die Liste der installierten Apps. Und wenn ich auf den ImageView-Anwendungsnamen und das Icon klicke, sollte die TabFragment1 ArrayList gehen, aber ich kann es nicht lösen. Die Anwendung stürzt ab, wenn ich auf iv klicke.Hinzufügen zu ArrayList von Adapter Android

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


} 

AddedApps

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

Crashlog:

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) 

Antwort

1

Ihre TabFragment1 Klasse initialisiert nicht verwenden sollten, eines seiner Mitglieder im Konstruktor: public List<AddedApps> data. Wenn Sie also versuchen, tab1.data.add(...) zu tun, haben Sie eine Nullreferenz gefunden, da onCreateView() noch nicht aufgerufen wurde und data immernoch null ist.

Überschreiben Sie den Konstruktor in Ihrer TabFragment1-Klasse, und initialisieren Sie das Member dort. Denken Sie daran, den Konstruktor super aufzurufen, damit sich die Fragment-Klasse normal verhält.

0

mit einem Recycler Ansicht Sie eine RecyclerView.Adapter <> und verwenden eine Schnittstelle den Klick Anruf, um wieder in Ihre Aktivität

+0

Ich habe 2 Adapter: 1 für die Recycleransicht und 1 für die Listenansicht. Ich möchte nur Daten in listView-Adapter ziehen und TabFragment1, dann RecyclerView-Adapter ziehen Daten in TabFragment1 und Füllen Recycler-Ansicht. –