Java 带有imageview和按钮的Listview自定义适配器

Java 带有imageview和按钮的Listview自定义适配器,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我试图为我的listview创建一个自定义阵列适配器,但是模拟器总是崩溃,我看不出我的代码在哪里好,在哪里不好 logcat显示“java.lang.OutOfMemoryError”,但我不知道如何解决。我试图修改studio.exe.vmoptions文件或从整个应用程序中删除图像(即使它们只有50x50),但没有任何努力 所以我会发布我的代码,请求您帮助我在我的应用程序中下单 提前谢谢你 public class MyClassAdapter extends ArrayAdapter<

我试图为我的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;
}
公共类MyClassAdapter扩展了ArrayAdapter{
私有静态类视图持有者{
文本视图Id;
图像视图图像;
文本视图名称;
文本视图描述;
文本视图类型;
文本视图成本;
文本视图计数;
文本视图评论;
纽扣;
按钮向下;
}
公共MyClassAdapter(上下文上下文、int textViewResourceId、ArrayList项){
super(上下文、textViewResourceId、项);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终板材项目=获取项目(位置);
持票人持票人;
if(convertView==null){
convertView=LayoutInflater.from(this.getContext())
.充气(R.layout.item_main,parent,false);
viewHolder=新的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\u up);
viewHolder.Buttondown=(Button)convertView.findViewById(R.id.Button\u向下);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
如果(项!=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(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
DBHelper mydb=newdbhelper(getContext());
mydb.AddPlate(item.getId());
项。倒计时();
//更新viewholder.Count
}
});
viewHolder.Buttondown.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
DBHelper mydb=newdbhelper(getContext());
mydb.RemovePlate(item.getId());
项目.倒计时();
//更新viewholder.Count
}
});
}
返回视图;
}
下面是我调用自定义ArrayAdapter的代码片段

        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全菜单;
FullMenu=mydb.getPlates(“主菜”);
板p;
int i;
MyClassAdapter=新的MyClassAdapter(此,0,完整菜单);
ListView ListView=(ListView)findViewById(R.id.list);
setAdapter(适配器);
对于(i=0;i
移动setadapter

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); 
ArrayList全菜单;
FullMenu=mydb.getPlates(“主菜”);
板p;
int i;
MyClassAdapter=新的MyClassAdapter(此,0,完整菜单);
ListView ListView=(ListView)findViewById(R.id.list);
对于(i=0;i
而且我认为您不需要这个,因为您应该从适配器本身读取数据

 for (i=0; i < FullMenu.size(); i++) {
        p = FullMenu.get(i);
        adapter.add(p);
    } 
(i=0;i{ p=完整菜单。获取(i); 添加(p); } 你可以查看我这里的这个样本,看看是否有适配器

在这里调用适配器

让我知道这是否有助于移动setadapter

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); 
ArrayList全菜单;
FullMenu=mydb.getPlates(“主菜”);
板p;
int i;
MyClassAdapter=新的MyClassAdapter(此,0,完整菜单);
ListView ListView=(ListView)findViewById(R.id.list);
对于(i=0;i
而且我认为您不需要这个,因为您应该从适配器本身读取数据

 for (i=0; i < FullMenu.size(); i++) {
        p = FullMenu.get(i);
        adapter.add(p);
    } 
(i=0;i{ p=完整菜单。获取(i); 添加(p); } 你可以查看我这里的这个样本,看看是否有适配器

在这里调用适配器


让我知道这是否有帮助

您应该动态调整图像的大小,以避免内存故障


祝你好运!

你应该动态调整你的图像大小,这样你就可以避免内存故障


祝你好运!

我花了2个小时试图设置类适配器,错误发生在函数调用中。现在我的小问题是,我无法调用onclick方法中的viewholder来实时更新计数,但我现在可以尝试一些东西了!:)这对我给你的剪报有帮助吗?还是你仍然有问题?太棒了!别忘了给我一个问题答案的复选标记:)我不可能忘记它,因为它是正确的答案,再次谢谢