java - 带有 ImageView 和按钮的 ListView 自定义适配器

标签 java android listview android-listview

我尝试为我的 ListView 制作一个自定义数组适配器,但模拟器总是崩溃,我看不到我的代码哪里好、哪里不好。

logcat 显示“java.lang.OutOfMemoryError”,但我不知道如何解决。我尝试修改 studio.exe.vmoptions 文件或从整个应用程序中删除图像(即使它们只有 50x50),但没有付出任何努力。

因此,我将发布我的代码,请求您帮助在我的应用程序中下订单。

提前谢谢您!

public class MyClassAdapter extends ArrayAdapter<Plate> {

private static class ViewHolder {
    TextView Id;
    ImageView Image;
    TextView Name;
    TextView Description;
    TextView Type;
    TextView Cost;
    TextView Count;
    TextView Comment;
    Button Buttonup;
    Button Buttondown;
}

public MyClassAdapter(Context context, int textViewResourceId, ArrayList<Plate> items) {
    super(context, textViewResourceId, items);
}

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

    final Plate item = getItem(position);
    ViewHolder viewHolder;
    if (convertView == null) {
        convertView = LayoutInflater.from(this.getContext())
                .inflate(R.layout.item_main, parent, false);

        viewHolder = new ViewHolder();
        viewHolder.Id = (TextView)convertView.findViewById(R.id.code);
        viewHolder.Image = (ImageView) convertView.findViewById(R.id.image);
        viewHolder.Name = (TextView) convertView.findViewById(R.id.name);
        viewHolder.Description = (TextView) convertView.findViewById(R.id.description);
        viewHolder.Cost = (TextView) convertView.findViewById(R.id.price);
        viewHolder.Count = (TextView) convertView.findViewById(R.id.count);
        viewHolder.Buttonup = (Button) convertView.findViewById(R.id.button_up);
        viewHolder.Buttondown = (Button) convertView.findViewById(R.id.button_down);



        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }


    if (item!= null) {
        viewHolder.Id.setText(String.format("%d",item.getId()));
        viewHolder.Image.setImageURI(item.getImage());
        viewHolder.Name.setText(String.format("%s", item.getName()));
        viewHolder.Description.setText(String.format("%s", item.getDescription()));
        viewHolder.Name.setText(String.format("%s", item.getName()));
        viewHolder.Cost.setText(String.format("%s", item.getCost()));
        viewHolder.Count.setText(String.format("%d", item.getCount()));
        viewHolder.Buttonup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DBHelper mydb= new DBHelper(getContext());
                mydb.AddPlate(item.getId());
                item.CountUp();
               //update viewholder.Count
            }
        });
        viewHolder.Buttondown.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                DBHelper mydb= new DBHelper(getContext());
                mydb.RemovePlate(item.getId());
                item.CountDown();
                //update viewholder.Count
            }
        });
    }
    return convertView;
}

这是我调用自定义 ArrayAdapter 的代码 fragment

        ArrayList<Plate> FullMenu;
        FullMenu = mydb.getPlates("Entrees");
        Plate p;
        int i;
        MyClassAdapter adapter = new MyClassAdapter(this,0,FullMenu);
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(adapter);
        for (i=0; i < FullMenu.size(); i++) {
            p = FullMenu.get(i);
            adapter.add(p);
        }

最佳答案

移动设置适配器

ArrayList<Plate> FullMenu;
    FullMenu = mydb.getPlates("Entrees");
    Plate p;
    int i;
    MyClassAdapter adapter = new MyClassAdapter(this,0,FullMenu);
    ListView listView = (ListView) findViewById(R.id.list);
    for (i=0; i < FullMenu.size(); i++) {
        p = FullMenu.get(i);
        adapter.add(p);
    }
    listView.setAdapter(adapter); 

我也不认为你需要这个,因为你应该从适配器本身读取数据

 for (i=0; i < FullMenu.size(); i++) {
        p = FullMenu.get(i);
        adapter.add(p);
    } 

你可以检查我这里的适配器示例 https://github.com/juangdiaz/CoffeeApp/blob/master/app/src/main/java/com/juangdiaz/coffeeapp/adapter/ListAdapter.java

并在此处调用适配器 https://github.com/juangdiaz/CoffeeApp/blob/master/app/src/main/java/com/juangdiaz/coffeeapp/fragments/CoffeeListFragment.java

请告诉我这是否有帮助

关于java - 带有 ImageView 和按钮的 ListView 自定义适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34711535/

相关文章:

Java 在按钮面板的左侧和右侧显示带 Canvas 的 JPanel

java - 从不同线程写入 Netty ChannelHandlerContext

android - 如何处理 Button 单击和 Listview 单击单行?

java - 带数组的 ListView

java - ListView 没有在 fragment 中更新

java - frame.repaint() 不工作

java - 来自数据库的 JasperReport .jasper 文件

java - Android 谷歌地图来自像浏览器一样的 fragment

android - 错误 : The type com. google.protobuf.GeneratedMessage$Builder 无法解析。它是从所需的 .class 文件中间接引用的

android - 我应该扩展 ListActivity 吗? (到目前为止,没有它已经很好地工作了)