2017-06-13 2 views
2

Ich habe einen benutzerdefinierten Adapter mit nur einem ImageView und einem TextView. Beim Scrollen ist es sehr langsam und wenn Sie genug Zeit scrollen, wird die App schließlich anhalten. Ich denke, dass die Art, wie ich mich diesem Thema näherte, nicht effizient ist?Android Studio benutzerdefinierte Listenansicht Scrollen langsam und verursacht App zu stoppen

public class CustomAdapter extends ArrayAdapter<String> { 

CustomAdapter(Context context, String[] breakfast) { 
    super(context, R.layout.custom_row, breakfast); 
} 

@NonNull 
@Override 
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.custom_row, parent, false); 
    } 
    String breakfastElement = getItem(position); 
    TextView customListTextView = (TextView) convertView.findViewById(R.id.customListTextView); 
    ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView); 

    customListTextView.setText(breakfastElement); 

    switch(breakfastElement) { 
     case "Bacon": 
      imageView.setImageResource(R.drawable.bacon); 
      break; 
     case "Eggs": 
      imageView.setImageResource(R.drawable.eggs); 
      break; 
     case "Toast": 
      imageView.setImageResource(R.drawable.toast); 
      break; 
     case "Ham": 
      imageView.setImageResource(R.drawable.ham); 
      break; 
     case "Hashbrown": 
      imageView.setImageResource(R.drawable.hashbrowns); 
      break; 
     case "Biscuits": 
      imageView.setImageResource(R.drawable.biscuit); 
      break; 
     case "Burrito": 
      imageView.setImageResource(R.drawable.burrito); 
      break; 
     case "Cereal": 
      imageView.setImageResource(R.drawable.cereal); 
      break; 
     case "Oatmeal": 
      imageView.setImageResource(R.drawable.oatmeal); 
      break; 
     case "Sausage": 
      imageView.setImageResource(R.drawable.sausage); 
      break; 
     case "Bagel": 
      imageView.setImageResource(R.drawable.bagel); 
      break; 
     case "Croissant": 
      imageView.setImageResource(R.drawable.croissant); 
      break; 
     case "Orange Juice": 
      imageView.setImageResource(R.drawable.orangejuice); 
      break; 
     case "Milk": 
      imageView.setImageResource(R.drawable.milk); 
      break; 
    } 
    return convertView; 
    } 
} 

Wenn ich nur das gleiche Bild für jedes Listenelement verwende, bekomme ich nicht das langsame Scrollen. Jede Hilfe ist willkommen

edit:

CustomAdapter(Context context, ArrayList<Breakfast> breakfastArrayList) { 
    super(context, R.layout.custom_row, breakfastArrayList); 
    breakfastArray = breakfastArrayList; 
} 

es mir nicht erlaubt, breakfastArrayList als dritter Parameter

+0

Die erste Zeile der Klasse, erweitern Sie den Adapter mit ArrayAdapter nicht mit ArrayAdapter

Antwort

3

haben eine Klasse Frühstück Daten wie diese

public class Breakfast { 

    private String name; 
    private Drawable drawable; 

    public Breakfast(String name, Drawable drawable) { 
    this.name = name; 
    this.drawable = drawable; 
    } 

    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 

    public Drawable getDrawable() { 
    return drawable; 
    } 

    public void setDrawable(Drawable drawable) { 
    this.drawable = drawable; 
    } 
} 

diese eine Arraylist von Frühstück Objekten erstellen wie

ArrayList<Breakfast> breakfastList = new ArrayList<>(); 
breakfastList.add(new Breakfast("Bacon",R.drawable.bacon); 
... 
.. 
. 

Pässe diese Arraylist zu Ihrem customadapter

public class CustomAdapter extends ArrayAdapter<Breakfast> { 

    public CustomAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 
    } 

    public CustomAdapter(Context context, int resource, List<Breakfast> items) { 
     super(context, resource, items); 
    } 
    ... 
    ... 
    ... 


    customListTextView.setText(breakfastList.get(position).getName()); 
imageView.setImageDrawable(breakfastList.get(position).getDrawable()); 

} 

PS: Da Sie beginnen, Android zu lernen, würde vorschlagen, dass Sie insuchenstatt Listview

+0

Entschuldigen Sie die Störung, wie sollte der Konstruktor von CustomAdapter aussehen? Ich habe dieses: Ich bearbeite meinen ursprünglichen Beitrag – ricefieldboy

+0

Ich habe meine Antwort mit dem Konstruktor bearbeitet. Wenn dies für Sie funktioniert, akzeptieren Sie diese Antwort. Danke –

+0

Wie auch immer, ich habe es endlich funktioniert, danke. Es gibt ein Problem bei der Verwendung von ArrayList.add zu oft und würde es stoppen. – ricefieldboy

2

ich bin sicher nicht zu passieren, was Ihr Fehler ist aber auf den Code von uns auf Ihre Ich bin mir nicht sicher, warum Sie hierfür einen ArrayAdapter verwendet haben. Wenn Sie ein Bild basierend auf dem Text anzeigen möchten, würde ich eine "BreakfastItem" -Klasse mit einem Frühstückselement erstellen; Müsli, Pop-Torte, Toast und paaren das Bild mit dem Frühstück. Sie können dies als Listenelement anzeigen.

+0

Ich habe gerade angefangen android dev Lernen, ich ein Tutorial bin nach und spielte, um mit ihm – ricefieldboy

+1

Okay, so der Array-Adapter ist einfach Wird verwendet, um der Listenansicht mitzuteilen, wie jedes Array-Listenelement aussehen soll. Angenommen, Sie haben unterschiedliche Frühstücksoptionen, können Sie eine Klasse erstellen, in der ein Name und ein Bild angezeigt werden. In der ArrayAdapter-Klasse weisen Sie dann den Adapter an, beide Objekte in den Space einzufügen, der dem Widget in XML entspricht. hast du ein (TextView) in deinem list_item xml deiner Einstellung den Namen des Frühstücksgegenstands und das Bild zu einem (ImageView). Aber auf der tatsächlichen Aktivität, wo die Daten angezeigt werden, ist, wo Sie Variationen der Frühstücksauswahl zu Ihrer Liste hinzufügen ... – Sav

Verwandte Themen