【问题标题】:Android Studio custom list view scrolling slow and causes app to stopAndroid Studio 自定义列表视图滚动缓慢并导致应用停止
【发布时间】:2017-06-13 00:45:09
【问题描述】:

我有一个自定义适配器,只有一个 ImageView 和一个 TextView。滚动时非常慢,如果滚动次数足够多,应用程序最终会停止。我认为我处理这个问题的方式效率不高?

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

如果我只为每个列表元素使用相同的图像,我不会得到缓慢的滚动。 任何帮助表示赞赏

编辑:

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

它不允许我将早餐数组列表作为第三个参数传递

【问题讨论】:

  • 类的第一行,使用 ArrayAdapter 扩展适配器,而不是使用 ArrayAdapter

标签: android listview custom-adapter


【解决方案1】:

有一个这样的早餐数据类

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

像这样创建一个早餐对象的数组列表

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

将此数组列表传递给您的自定义适配器

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 : 鉴于您开始学习 Android,建议您查看 RecyclerView 而不是 ListView

【讨论】:

  • 不好意思打扰了,CustomAdapter的构造函数应该是什么样子的?我有这个:我将编辑我的原始帖子
  • 我已经用构造函数编辑了我的答案。如果这对您有用,请接受此答案。谢谢
  • 无论如何,我终于成功了,谢谢。使用 ArrayList.add 次数过多会导致它停止。
【解决方案2】:

我不确定您的错误是什么,但是从查看您的代码来看,我不确定您为什么为此使用 ArrayAdapter。如果您想根据文本显示图像,我将创建一个带有早餐项目的“BreakfastItem”类;麦片、馅饼、吐司,并将图像与早餐项目配对。然后,您可以将其显示为列表项。

【讨论】:

  • 我刚开始学习android dev,我正在学习一个教程并玩弄它
  • 好的,数组适配器只是用来告诉列表视图您希望每个数组列表项的外观。假设您有不同的早餐选择,您可以创建一个包含名称和图像的类。然后在 ArrayAdapter 类中,您告诉适配器将这两个项目放在与 xml 中的小部件相对应的空间中。您是否在 list_item xml 中有一个(TextView),您将早餐项目名称设置为该名称并将图像设置为(ImageView)。但在显示数据的实际活动中,您正在将早餐选择的变体添加到您的列表中......
猜你喜欢
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多