Android:ListView中的重复项目。也许getView()调用次数太多了?

时间:2011-01-13 09:51:35

标签: android listview listadapter

我正在尝试创建一个显示“购物”的简单程序 购物车“项目列表,以及它下面的几个按钮来管理 车。

最大的问题是项目中的重复条目 列表显示。也就是说,对于我要输入的每件物品,我都会看到它 在列表视图中两次。有什么问题?另外,可滚动 我购物车的面积不够大。如何设置它以便它 更大,但我还能看到我的按钮?也许我应该把 推车上方的按钮?

这是我购物车的布局XML:

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Shopping Cart" />

    <ScrollView android:id="@+id/ScrollView01"
        android:layout_width="fill_parent"
        android:layout_height="110px">

        <ListView
            android:id="@+id/BookList"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        </ListView>

    </ScrollView>

    <Button android:text="Add Another Book"
        android:id="@+id/AddAnother"
        android:layout_width="250px"
        android:textSize="18px"
        android:layout_height="55px">
    </Button>

    <Button android:text="Checkout"
        android:id="@+id/Checkout"
        android:layout_width="250px"
        android:textSize="18px"
        android:layout_height="55px">
    </Button>

</LinearLayout>

以下是各个行项目的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="8dip">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dip"
        android:layout_weight="1"
        android:layout_height="fill_parent">

        <TextView
            android:id="@+id/BookTitle"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:singleLine="true"
            android:gravity="center_vertical"
        />

        <TextView
            android:id="@+id/BookPrice"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:singleLine="true"
            android:ellipsize="marquee"
        />
    </LinearLayout>

    <Button
        android:id="@+id/buttonLine"
        android:gravity="center"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true"
        android:text="Delete"
    />
</LinearLayout>

这是购物车活动的java代码:

package com.sellbackyourbook.sellback;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import android.app.Activity;
//import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

public class cart extends Activity 
{
    private ListView m_bookListView;
    private BookAdapter m_adapter;

    //private static String[] data = new String[] = { ""

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) 
    {
        ShoppingCartSingleton shoppingCart = ShoppingCartSingleton.getInstance();

        super.onCreate(savedInstanceState);
        setContentView(R.layout.shoppingcart);

        this.m_adapter = new BookAdapter(this, R.layout.cartitem,
            shoppingCart.m_books);

        m_bookListView = (ListView) findViewById(R.id.BookList);
        m_bookListView.setAdapter(this.m_adapter);

        //setListAdapter(this.m_adapter);

        if (shoppingCart.m_books != null && shoppingCart.m_books.size() > 0)
        {
            //m_adapter.notifyDataSetChanged();

            try
            {

            //m_adapter.clear();
                //for(int i=0;i<1;i++)

            Log.i("ARRAY", "m_books.size() before loop" + shoppingCart.m_books.size());

            int size = shoppingCart.m_books.size();

            for(int i=0;i<size;i++)
            {   
                Log.i("ARRAY", "size in loop" + size);
                Log.i("ARRAY", "adding item to adapter" + i);
                m_adapter.add(shoppingCart.m_books.get(i));
            }

        } catch (RuntimeException e) {
            e.printStackTrace();
        }

        //m_adapter.notifyDataSetChanged();
        }

        Button buttonAddAnother = (Button) findViewById(R.id.AddAnother);
        buttonAddAnother.setOnClickListener(new View.OnClickListener() 
        {
            public void onClick(View view) 
            {
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();
            }
        });

        // TODO: only show this button if the shopping cart is not empty

        Button buttonCheckout = (Button) findViewById(R.id.Checkout);
        buttonCheckout.setOnClickListener(new View.OnClickListener() 
        {
            public void onClick(View view) 
            {
                // TODO: open sellbackyourbook website using book ISBNs

                ShoppingCartSingleton shoppingCart = ShoppingCartSingleton.getInstance();

                String isbnList = "";
                String checkoutURL = "http://www.sellbackyourbook.com/androidcart.php?isbn=";

                for (Iterator<Book> i = shoppingCart.m_books.iterator(); i.hasNext();  )
                {
                    Book currentBook = (Book) i.next();
                    isbnList = isbnList + currentBook.getBookISBN() + ","; 
                }

                checkoutURL = checkoutURL + isbnList;
                Log.i("CHECKOUT URL", "checkout URL to submit: " + checkoutURL);

                Intent myIntent = new Intent(Intent.ACTION_VIEW);
                myIntent.setData(Uri.parse(checkoutURL));
                startActivity(myIntent);
            }
        });

    }

    private class BookAdapter extends ArrayAdapter<Book> {

        private ArrayList<Book> books;

        public BookAdapter(Context _context, int _textViewResourceId, ArrayList<Book> _books) 
        {
                super(_context, _textViewResourceId, _books);
                this.books = _books;
        }

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

            System.out.println("getView " + position + " " + convertView);

            View v = convertView;

                if (v == null) {
                    LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.cartitem, null);
                }

                Book b = books.get(position);

                if (b != null) 
                {
                    TextView bTitle = (TextView) v.findViewById(R.id.BookTitle);
                    TextView bPrice = (TextView) v.findViewById(R.id.BookPrice);

                        if (bTitle != null) 
                        {
                            bTitle.setText(b.getBookTitle());  
                        }

                        if (bPrice != null)
                        {
                            bPrice.setText(b.getBookPrice());
                        }
                }

                return v;
        }
    }   
}

这是我的购物车的Java代码。我正确使用单身人士吗?我真的只是想要一种快速而肮脏的方式来允许多个活动访问购物车,因为不同的活动实际上从用户那里抓取书籍,并且此活动将它们显示在购物车中。

我在onCreate()中遍历书籍时遇到了问题。由于某种原因,size()函数在循环中不断增加,因此我更改了代码并添加了“size”变量以避免在循环本身中调用size()。我不确定那是什么。

3 个答案:

答案 0 :(得分:0)

我做的完全一样,我的getView根本没有被调用。 这是我受到启发的脚本,也许它会有所帮助: http://mfarhan133.wordpress.com/2010/10/14/list-view-tutorial-for-android/

答案 1 :(得分:0)

删除我所拥有的循环解决了问题:

m_adapter.add(shoppingCart.m_books.get(i));

似乎BookAdapter构造函数已经在处理它,所以我使用add()方法复制了这些项目。

答案 2 :(得分:0)

是的,你是BookAdapter的构造函数。但是getView()的{​​{1}}方法是错误的。请查看http://www.youtube.com/watch?v=wDBM6wVEO70(来自Google),以便正确了解如何使用BookAdapter