ListAdapter错误:IndexOutOfBoundsException:索引0无效,大小为0

时间:2014-12-09 02:24:28

标签: java android

我想创建一个Listview,它开始为空,并在我选择产品时显示产品。但是在这个阶段,我只想将它们添加到ArrayList Pedido 中的ArrayList。我运行应用程序,它只是显示错误“不幸的是,应用程序停止”。

MainActivity.java

public class MainActivity extends Activity {

    private ArrayList<Produto> array_produtos;
    private ArrayList<Pedido> produtos_pedidos;
    private int numero_pedidos=0;
    private Produto produto_1;
    private Produto produto_2;
    private Pedido pedido_1;
    private ListView lv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        array_produtos = new ArrayList<Produto>();
        produtos_pedidos = new ArrayList<Pedido>();
        numero_pedidos=0;   

        //Product initiation
        produto_1 = new Produto(1, "Café",0.60,4,4,R.drawable.cafe1);
        produto_2 = new Produto(2, "Água", 0.90,3,2, R.drawable.luso1);

        array_produtos.add(produto_1);
        array_produtos.add(produto_2);

        pedido_1 = new Pedido(); //cria primeiro pedido
        produtos_pedidos.add(pedido_1); //Atribui à lista de pedidos

        lv = (ListView) findViewById(R.id.lv_produtos_pedidos);
        lv.setAdapter(new LVAdapter(this, produtos_pedidos));

    }

    public void itemClickedList(int position) {
        Toast.makeText(getBaseContext(), "Produto removido!", Toast.LENGTH_LONG).show();
        produtos_pedidos.get(numero_pedidos).getArray_produtos().remove(position);
    }

}

LVAdapter.java

public class LVAdapter implements ListAdapter {

    private Context ctx;
    private ArrayList<Pedido> list;

    public LVAdapter(Context ctx, ArrayList<Pedido> pdd){
        this.list = pdd;
        this.ctx = ctx;
    }
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return list.get(position).getCod();
    }

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


        View itemView;
        LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null){

            itemView = new View(ctx);

            itemView = inflater.inflate(R.layout.item_view, null);
            TextView textView = (TextView) itemView.findViewById(R.id.tv_gridrow);
            ImageView imageView = (ImageView) itemView.findViewById(R.id.item_icon);

            textView.setText(list.get(0).getSpecificProduct(position));
            imageView.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        if(ctx instanceof MainActivity){
                            ((MainActivity)ctx).itemClickedList(position);
                        }
                    }
                });

            } else {
                itemView = (View) convertView;
        }

        return itemView;
    }

    //I deleted the other created methods, to make it short
}

item_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/item_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="5dp"
        android:adjustViewBounds="true"
        android:maxHeight="45dp"
        android:maxWidth="45dp"
        android:src="@drawable/ballot_x_u2717_icon_256x256" />

    <TextView
        android:id="@+id/item_txtMake"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        android:layout_marginLeft="10dp"
        android:layout_alignParentLeft="true"
        android:text="Make Shown Here"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

Pedido.java

public class Pedido {

    private final int cod;
    private static int cod_aux=1;
    private int tempo_total;
    private double preco;
    private ArrayList<Produto> array_produtos;

    public Pedido() {
        this.cod = cod_aux;
        cod_aux++;
        array_produtos = new ArrayList<Produto>();
    }

    public void addProduto(Produto prodt){
        this.array_produtos.add(prodt);
        this.tempo_total += prodt.getTempo();
        this.preco += prodt.getPreco();
    }

    public int getTempoEspera(){
            return this.tempo_total;
    }

    public int getCod() {
        return cod;
    }

    public int getTempo_total() {
        return tempo_total;
    }

    public double getPreco() {
        return preco;
    }

    public ArrayList<Produto> getArray_produtos() {
        return array_produtos;
    }

public String getSpecificProduct(int position) {
    if (array_produtos.isEmpty()) {
        return "";
    }else{
    return array_produtos.get(position).getNome();
    }
 }
}

这是我的日志猫

12-09 02:16:23.996: E/AndroidRuntime(1923): FATAL EXCEPTION: main
12-09 02:16:23.996: E/AndroidRuntime(1923): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
                                            at java.util.ArrayList.get(ArrayList.java:304)
                                            at com.grupo26.mremployee.Pedido.getSpecificProduct(Pedido.java:46)
                                            at com.grupo26.mremployee.LVAdapter.getView(LVAdapter.java:54)
                                            at android.widget.AbsListView.obtainView(AbsListView.java:2267)
                                            at android.widget.ListView.makeAndAddView(ListView.java:1769)
                                            at android.widget.ListView.fillDown(ListView.java:672)
                                            at android.widget.ListView.fillFromTop(ListView.java:733)
                                            at android.widget.ListView.layoutChildren(ListView.java:1622)
                                            at android.widget.AbsListView.onLayout(AbsListView.java:2102)
                                            at android.view.View.layout(View.java:13754)
                                            at android.view.ViewGroup.layout(ViewGroup.java:4362)
                                            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948)
                                            at android.view.View.layout(View.java:13754)
                                            at android.view.ViewGroup.layout(ViewGroup.java:4362)
                                            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
                                            at android.view.View.layout(View.java:13754)
                                            at android.view.ViewGroup.layout(ViewGroup.java:4362)
                                            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
                                            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
                                            at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
                                            at android.view.View.layout(View.java:13754)

2 个答案:

答案 0 :(得分:1)

更改getSpecificProduct

public String getSpecificProduct(int position) {
    if (array_produtos.isEmpty() || array_produtos.size()<position+1) {
        return "";
    }else{
    return array_produtos.get(position).getNome();
    }
 }

您也可以更改此行

textView.setText(list.get(0).getSpecificProduct(position));

用这个

if (list.size()>0) {
   textView.setText(list.get(0).getSpecificProduct(position));
}

答案 1 :(得分:0)

getSpecificProduct(...)正在访问一个空的列表。您正在将适配器的位置传递到Pedido对象上存在的空列表中,这不是getView

中的预期列表

我假设您正在尝试实际制作产品列表,在这种情况下,为什么您不只是让您的适配器使用ArrayList<Produto>