2016-07-24 7 views
-2

Die Methode onItemSelected funktioniert nicht und ich weiß nicht warum.Methode "onItemSelected" funktioniert nicht in Array-Adapter und auch in Fragment

Unten ist mein Code.

Array Adapter:

public class MyListAdapter extends ArrayAdapter { 
    Spinner spinner; 
    ListView listView; 

    /*public MyListAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 
    }*/ 

    public MyListAdapter(Context context) { 
     super(context, R.layout.single_listview_item); 
    } 




    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 

     spinner = (Spinner) convertView.findViewById(R.id.simpleSpinner); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
       getContext(), 
       R.array.country_arrays, 
       android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 
     System.out.println("ciao1"); 

     // spinner.setOnItemSelectedListener(this); 

     return row; 
    } 



    /* @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     String selState = (String) spinner.getSelectedItem(); 
     System.out.println(selState); 
     Toast.makeText(
       getContext(), 
       "Clicked on Planet: " + selState + "", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 

    }*/ 

    } 

Fragment:

ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_list2, container, false); 
     listView = (ListView) rootView.findViewById(R.id.listview); 
     ListAdapter listAdapter = new MyListAdapter(getContext()); 
     listView.setAdapter(listAdapter); 
//  listView.setOnItemClickListener(this); 
     listView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
     { 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long i) 
      { 
       listView.setSelection(position); 
       String selState = (String) listView.getSelectedItem(); 
       Toast.makeText(
         getContext(), 
         "Clicked on Planet: " + selState + "", Toast.LENGTH_SHORT).show(); 

      } 

      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 

      } 
     }); 

Antwort

0

Auf Listviews Sie onItemClicked verwenden. OnItemSelected ist für Spinner. Es ist eine jener Android Belästigungen ...

+0

i muss die Methode in Array-Adapter oder Fragment? –

+0

Wie muss ich Code schreiben, um den Namen des Objekts in die Liste der Spinner aufzunehmen? –

+0

kannst du mir bitte helfen? –

-1

In gewählter OnItemSelectedListener(this) innerhalb der ArrayAdapter Einstellung, ich glaube, das Problem ist, dass, weil jeder Spinner in der Liste die gleiche Instanz von MyListAdapter verweist, Ihre OnItemSelected Methode nicht unterscheidet, ist die Spinner innerhalb Ihrer Liste wurde tatsächlich aus-- ausgewählt - es verweist nur auf das Spinner-Objekt, das zuletzt auf die MyListAdapter.spinner Referenz gesetzt wurde, die die letzte in der Liste sein sollte.

Um dies zu beheben, verwenden Sie nicht spinner.getSelectedItem(). Verwenden Sie stattdessen ((Spinner) parent).getSelectedItem(), da das übergeordnete Objekt der tatsächliche ausgewählte Spinner ist. Zu diesem Zeitpunkt sollten Sie die Spinner-Variable local für die getView-Methode festlegen.

In der Methode des Aufrufs listView.setOnItemSelectedListener(...) in dem Fragment erwarte ich, dass Sie listView.setOnItemClickListener(...) haben, aber das wird für einen Klick auf eine Zeile in Ihrer Liste, nicht eine Auswahl aus einem Spinner zu hören.

Um eine Auswahl von einem Ihrer Spinner zu erkennen, machen Sie die erste Änderung oben. Um einen Klick auf eine Zeile in Ihrer ListView ebenfalls zu erkennen, wechseln Sie zu listView.setOnItemClickListener. Ohne mehr Kontext für Ihr Ziel oder die tatsächlichen Fehler, ist es schwer zu sagen, ob beide oder nur die erste gewünscht ist.

EDIT: Von Ihren Kommentaren, ich glaube, Sie dies in Ihrem MyListAdapter haben sollten:

public class MyListAdapter extends ArrayAdapter implements AdapterView.OnItemSelectedListener { 

public MyListAdapter(Context context) { 
    super(context, R.layout.single_listview_item); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 

    Spinner spinner = (Spinner) row.findViewById(R.id.simpleSpinner); 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
      parent.getContext(), 
      R.array.country_arrays, 
      android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner.setAdapter(adapter); 
    spinner.setOnItemSelectedListener(this); 

    return row; 
} 

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
    String selState = (String) ((Spinner) parent).getSelectedItem(); 
    System.out.println(selState); 
    Toast.makeText(
      parent.getContext(), 
      "Clicked on Planet: " + selState + "", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onNothingSelected(AdapterView<?> parent) { 

} 

} 

Und dies in Ihrem Fragmente (keine Zuhörer):

ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_list2, container, false); 
    listView = (ListView) rootView.findViewById(R.id.listview); 
    ListAdapter listAdapter = new MyListAdapter(getContext()); 
    listView.setAdapter(listAdapter); 
+0

Entschuldigung, können Sie Code schreiben? Bitte? –

+0

Wenn ich auf ein Objekt klicke, wie kann ich Toast mit dem Objektnamen anzeigen, auf den ich klicke? –

+0

Nach weiterem Blick auf Ihren Code, habe ich etwas Selbstvertrauen verloren. Können Sie erklären, was Sie zu tun versuchen? Ihr Code sieht aus, als ob er eine ListView einer einzelnen Zeile erstellt, die einen Spinner enthält, und das scheint völlig redundant zu sein. Es sieht so aus, als hätten Sie Beispiele für zwei verschiedene Methoden zum Erstellen einer auswählbaren Liste (ein einfacher Spinner im Vergleich zu einem ListView mit einem OnItemClickListener). Willst du eine Liste von Spinner oder nur einen Spinner? – jawheele