2017-01-19 1 views
0

Ich habe folgendes Listview:Wie wird die Methode der Aktivität in Fragment aufgerufen?

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    //CheckBoxAdapter cb = new CheckBoxAdapter(this.getActivity(),R.layout.item, getResources().getStringArray(R.array.products)); 
    //lv.setAdapter(cb); 
    ArrayAdapter<String> arrayAdapter; 
    arrayAdapter = new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, categories); 

    ListView lv = (ListView) this.getActivity().findViewById(R.id.listProduct); 
    lv.setAdapter(arrayAdapter); 

    lv.setOnItemClickListener(
      new AdapterView.OnItemClickListener(){ 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        String type = String.valueOf(parent.getItemAtPosition(position)); 
        Toast.makeText(getContext(), parent.getItemAtPosition(position)+" is selected", Toast.LENGTH_LONG).show(); 
        try { 
         MainActivity.AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 
        } catch (TimeoutException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
    ); 

Aber zur Zeit kann ich nicht AddSubscription verweisen, die nicht statische ist

MainActivity.AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 

ich eine nicht statische Zuhörer erstellen müssen, die AddSubscription nennen kann, ist es möglich, mit einem Listview ? Wenn nicht, kann ich einen anderen Ansichtstyp verwenden?

+1

MainActivity entfernen. , rufen Sie direkt AddSubscription (...) Methode –

+0

Dies ist in einem Fragment – Jon

Antwort

0

einfach, wenn Ihr Fragment in MainActivity tun dies gesetzt wird:

((MainActivity)getActivity()).AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 
+1

Funktioniert nicht, zuerst aus der Methode addsubscription ist innerhalb von Mainactivity, zweiten gab es mir den Fehler: "MainActivity ist keine einschließende Klasse" – Jon

+0

Diese Listenansicht ist in einem Fragment – Jon

+0

Oh, wenn in Fragment, hast du versucht, 'getActivity()' aufzurufen? – Ekalips

0

ich getActivity() nicht und warf verwenden würde, da dieser Ansatz zu zerbrechlich mir scheint.

Ich tippte das aus meinem Kopf ohne eine IDE, so könnte es Tippfehler geben. Lassen Sie die Activity eine Schnittstelle SubscriptionHandler

public interface SubscriptionHandler { 
    public void addSubscription(String identifier); 
} 

Actitiy

public MainActivity extends AppCompatActivity implements SubscriptionHandler { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_id); 
     fragment.setSubscriptionHandler(this); 
    } 

    @Override 
    public void addSubscription(String identifier){ 
    //logic 
    } 

} 

und dann diese in dem Fragment implementieren verwenden

public class MyFragment extends Fragment { 

    @Nullable private SubscriptionHandler subscriptionHandler; 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     ArrayAdapter<String> arrayAdapter; 
     arrayAdapter = new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, categories); 

     ListView lv = (ListView) this.getActivity().findViewById(R.id.listProduct); 
     lv.setAdapter(arrayAdapter); 

     lv.setOnItemClickListener(
      new AdapterView.OnItemClickListener(){ 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        String type = String.valueOf(parent.getItemAtPosition(position)); 
        Toast.makeText(getContext(), parent.getItemAtPosition(position)+" is selected", Toast.LENGTH_LONG).show(); 
        try { 
         if(subscriptionManager != null) { 
          subscriptionHandler.addSubscription(String.valueOf(parent.getItemAtPosition(position))); 
         } 
        } catch (TimeoutException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
    ); 

    public void setSubscriptionHandler (SubscriptionHandler subscriptionHandler) { 
     this.subscriptionHandler = subscriptionHandler; 
    } 
} 
+0

Ok danke, wissen Sie, wie das Fragment zu holen? Einen Fragmentmanager zu installieren und findfragmentbyId aufzurufen, scheint nur ein Objekt vom Typ Fragment zurückzugeben, ich brauche es vom selben Klassentyp wie meines. – Jon

+0

Die Verwendung des FragmentManagers ist der richtige Ansatz, Sie müssen ihn nur auf die gleiche Weise wie mit Schaltflächen und allen anderen Ansichten anwenden. Stellen Sie sicher, dass Sie den richtigen FragmentManager verwenden. Ich bearbeitete die Antwort – Altoyyr

+0

Es scheint, als ob dieser Ansatz null zurückgibt, ich hoffe, ich habe das ID-XML-Tag an der richtigen Stelle hinzugefügt Android: ID = "@ + ID/listFragment" Dies ist unter dem framelayout – Jon

0

Gehen Sie wie folgt in den Hörer:

YourFragmentName.this.((MainActivity)getActivity()).AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 
Verwandte Themen