2017-10-23 3 views
0

Ich versuche zu entwickeln und Android-App und ich habe einen benutzerdefinierten Adapter für eine ListView, die Inhalte zu ändern, wenn der Benutzer eine andere Option aus einer segmentierten ändert Gruppe.Benutzerdefinierte ListView aktualisiert nur bei der ersten Aktion, kein Inhalt wird bei der zweiten Aktion angezeigt

Es funktioniert zunächst, so dass die segmentierte Steuerung geändert wird und der Inhalt korrekt angezeigt wird. Bei einer zweiten Auswahl wird jedoch kein Inhalt angezeigt, obwohl alle Daten verfügbar sind.

Alle Ratschläge, wie Sie den Adapter richtig stark würde aktualisieren sein geschätzt

-Code der Adapter und Listview-Daten

SegmentedButtonGroup segmentedButtonGroup = (SegmentedButtonGroup) 
findViewById(R.id.segmented_button_group); 
segmentedButtonGroup.setOnClickedButtonPosition(new 
SegmentedButtonGroup.OnClickedButtonPosition() { 
     @Override 
     public void onClickedButtonPosition(int position) { 
      Toast.makeText(listing_see.this, "Clicked: " + position, 
      Toast.LENGTH_SHORT).show(); 

      // Need to make this update the list view on click 
      if(position == 0){ 
       adapter.clear(); 
       adapter = new CustomListAdapter(listing_see.this, titles1, 
       allThumbnails1, blurbs1); 
       adapter.notifyDataSetChanged(); 
       list.setAdapter(adapter); 
      } else if (position == 1){ 
       adapter.clear(); 
       adapter = new CustomListAdapter(listing_see.this, titles2, 
       allThumbnails2, blurbs2); 
       adapter.notifyDataSetChanged(); 
       list.setAdapter(adapter); 
      } else if (position == 2){ 
       adapter.clear(); 
       adapter = new CustomListAdapter(listing_see.this, titles3, 
       allThumbnails3, blurbs3); 
       adapter.notifyDataSetChanged(); 
       list.setAdapter(adapter); 
      } 
     } 
    }); 

listingview.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="110dp" 
     android:layout_height="80dp" 
     android:padding="5dp" /> 

    <LinearLayout android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/item" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Medium Text" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:layout_marginLeft="10dp" 
      android:layout_marginTop="5dp" 
      android:padding="2dp" 
      android:textColor="#33CC33" /> 
     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="TextView" 
      android:layout_marginLeft="10dp"/> 
    </LinearLayout> 
</LinearLayout> 

CustomListAdapter

zu ändern
public class CustomListAdapter extends ArrayAdapter<String> { 

    private final Activity context; 
    private final List<String> itemname; 
    private final List<String> imgid; 
    private final List<String> blurbs; 

    public CustomListAdapter(Activity context, List<String> itemname, List<String> imgid, List<String> blurbs) { 
     super(context, R.layout.listingview, itemname); 

     this.context=context; 
     this.itemname=itemname; 
     this.imgid=imgid; 
     this.blurbs=blurbs; 
    } 

    public View getView(int position,View view,ViewGroup parent) { 
     LayoutInflater inflater=context.getLayoutInflater(); 
     View rowView=inflater.inflate(R.layout.listingview, null,true); 

     TextView txtTitle = (TextView) rowView.findViewById(R.id.item); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.icon); 
     TextView extratxt = (TextView) rowView.findViewById(R.id.textView1); 

     int imageID = getContext().getResources().getIdentifier(imgid.get(position), "drawable", context.getPackageName()); 

     txtTitle.setText(itemname.get(position)); 
     imageView.setImageResource(imageID); 
     extratxt.setText(blurbs.get(position)); 
     return rowView; 
    }; 
} 

Einige Screenshots des Simulators zu zeigen, was passiert: gesehen Screenshots of what is happening

Initial Load-Displays, wie erwartet, ein Klick auf ein anderes Register richtig angezeigt wird das erste Mal, und dann bewirkt, dass ein anderes Register Auswahl keine Daten zu.

Antwort

0

ändern

adapter.clear(); 
adapter = new CustomListAdapter(listing_see.this, titles1, 
allThumbnails1, blurbs1); 
adapter.notifyDataSetChanged(); 
list.setAdapter(adapter); 

zu

adapter.clear(); 
adapter.add(titles2, allThumbnails2, blurbs2); 
adapter.notifyDataSetChanged(); 

das ist alles. Sie machen jedes Mal ein neues Objekt des Adapters und so macht adapter.clear() nichts. Auch nach dem Erstellen eines neuen Objekts des Adapters ist dieses bestimmte Objekt nicht an die Liste angefügt, aber Sie rufen notifyDataSetChanged auf.

Sie sollten tun 1. Löschen Sie die Adapterdaten.

  1. Neue Daten zum Adapter hinzufügen.

  2. NotifyDataSetChanged. (Es sollte kein new CustomListAdapter Schlüsselwort verwendet werden).

Hoffe, das hilft.

+0

Hallo, vielen Dank für Ihre Antwort. Das einfache Hinzufügen funktioniert nicht für meine Situation, da ich 3 Werte für das Objekt übergebe, da meine Liste einen Titel, einen Klappentext und eine Miniaturansicht (als String) enthält. Ich denke, dass dies in meinem CustomListAdapter überladen werden muss, um arbeiten zu können, aber ich bin nicht ganz sicher, wie ich das erreichen kann. – Ashley

+0

Nach weiterem Nachdenken über das Problem, vielleicht, wenn ich die 3 Elemente, die ich übergeben, in ein Objekt und übergebe das Objekt übergeben, ändern Sie den CustomListAdapter Konstruktor es funktioniert möglicherweise mit, was Sie vorgeschlagen. – Ashley

+0

können Sie Builder based Setter erstellen, um Elemente hinzuzufügen, oder Sie können eine Methode mit 3 Argumenten erstellen. –

Verwandte Themen