我想创建一个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)
答案 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>
?