每次活动恢复时自定义列表视图重复(android)

时间:2017-07-21 13:32:24

标签: java android listview

我的android自定义列表视图存在这个问题,每次我退出活动(即点击模拟器上的“后退”按钮),然后返回到包含此自定义列表视图的同一活动,列表视图添加了额外的一行。

例如,最初是:

item a

当我离开那个活动并回到它时,该行加倍:

item a
item a

但是,当我再次重启模拟器时,自定义列表视图会返回到从sqlite检索到的原始数据。

如何阻止行加倍? 这是我的代码。

list.java:

//DATABASE
    MyItems mi;
    //For Items display - ArrayList
    private ArrayList<SalesItemInformationLV> displayiteminfo;
           /* new ArrayList<SalesItemInformationLV>(); */
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_sale_item);



        final float sellingpvalue = 13.5f;
        final float costpvalue = 19.0f;
        final String datesoldvalue = "9/9/1995";
        final String staffdiscountvalue = "true";

        mi = MyItems.getInstance();
        displayiteminfo = mi.retrieveAllForlist(getApplicationContext());



        //New array adapter for customised ArrayAdapter
        final ArrayAdapter<SalesItemInformationLV> adapter = new itemArrayAdapter(this, 0, displayiteminfo);
        //displayiteminfo - the ArrayList of item objects to display.

        //Find the list view, bind it with custom adapter
        final ListView listView = (ListView)findViewById(R.id.customListview);
        listView.setAdapter(adapter);
       // listView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 9));

        //LONG PRESS CONTEXT MENU
        registerForContextMenu(listView);

        //Selecting the listview item!
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                SalesItemInformationLV saleitem = displayiteminfo.get(position);
                String namevalue = saleitem.getItemname();
                int qtyvalue = saleitem.getItemquantity();

                Intent myintent = new Intent(ListSaleItemActivity.this, ViewSaleDetails.class);
                myintent.putExtra("itemname", namevalue);
                myintent.putExtra("itemqty", qtyvalue);
                myintent.putExtra("itemcp", costpvalue);
                myintent.putExtra("itemsp", sellingpvalue);
                myintent.putExtra("itemds", datesoldvalue);
                myintent.putExtra("itemsstaffdis", staffdiscountvalue);

                startActivity(myintent);

            }
        });



    }



    //custom Arrayadapter
    class itemArrayAdapter extends ArrayAdapter<SalesItemInformationLV>
    {
        private  Context context;
        private List<SalesItemInformationLV> item;



        //constructor, call on creation
        public itemArrayAdapter(Context context, int resource, ArrayList<SalesItemInformationLV> objects) {

            //chaining to "default constructor" of ArrayAdapter manually
            super(context, resource, objects);
            this.context = context;
            this.item = objects;

        }

        //called to render the list

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


            //get the item we are displaying
            SalesItemInformationLV iteminfo = item.get(position);

            //get the inflater and inflate the xml layout for each item
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.item_layout, null);


            //Each component of the custom item_layout
            TextView name = (TextView) view.findViewById(R.id.ItemNameSales);
            TextView qty = (TextView)view.findViewById(R.id.ItemNameQty);

            //set the name of item - access using an object!
            name.setText(String.valueOf(iteminfo.getItemname()));

            //set the quantity of item - access using an object!
            qty.setText(String.valueOf(iteminfo.getItemquantity()));

            return view;
            //Now return to onCreate to use this cuztomized ArrayAdapter


        }
    }

Myitems.java:

public class MyItems extends Application {

    //ID and contact information
    private List<String> contactList;
    private List<Integer> contactIdList;
    private  static MyItems ourInstance = new MyItems();

    //Populate SaleItemInformationLV
    private ArrayList<SalesItemInformationLV> displayiteminfo2 =
            new ArrayList<SalesItemInformationLV>();

    public  MyItems()
    {
        contactList = new ArrayList<String>();
        contactIdList = new ArrayList<Integer>();
    }

    public  static  MyItems getInstance(){
        return ourInstance;
    }
//RETRIEVE ALL ENTRIES
    //LISTVIEW
    public  ArrayList<SalesItemInformationLV> retrieveAllForlist(Context c)
    {
        Cursor myCursor;
        String mystring = "";

        MyDbAdapter db = new MyDbAdapter(c);
        db.open();
        //contactIdList.clear();
        //contactList.clear();
        myCursor = db.retrieveAllEntriesCursor();

        if (myCursor !=null && myCursor.getCount()>0)
        {
            myCursor.moveToFirst();
            do {

                displayiteminfo2.add(new SalesItemInformationLV(myCursor.getString(db.COLUMN_NAME_ID), db.COLUMN_QTYSOLD_ID));

            } while (myCursor.moveToNext());
        }
        db.close();
        return  displayiteminfo2;
    }

2 个答案:

答案 0 :(得分:1)

MyItems是一个(java-)单身人士。每次拨打public ArrayList<SalesItemInformationLV> retrieveAllForlist(Context)时,add中的displayiteminfo2个对象都会返回此列表。
如果您再次拨打retrieveAllForlist,则保留与其中已有对象相同的列表,并为其添加更多内容。

在函数中返回private实例对象是一种糟糕的模式。你班级以外的任何东西都可以修改列表。只需创建一个用于返回它。

public  ArrayList<SalesItemInformationLV> retrieveAllForlist(Context c)
{
    ArrayList<SalesItemInformationLV> items = new ArrayList<SalesItemInformationLV>();

    Cursor myCursor;
    String mystring = "";

    MyDbAdapter db = new MyDbAdapter(c);
    db.open();
    //contactIdList.clear();
    //contactList.clear();
    myCursor = db.retrieveAllEntriesCursor();

    if (myCursor != null && myCursor.getCount() > 0)
    {
        myCursor.moveToFirst();
        do {
            items.add(new SalesItemInformationLV(myCursor.getString(db.COLUMN_NAME_ID), db.COLUMN_QTYSOLD_ID));
        } while (myCursor.moveToNext());
    }
    db.close();

    return items;
}

答案 1 :(得分:0)

看起来MyItems是一个单身人士。您是否在通话前清除了值 mi.retrieveAllForlist(getApplicationContext())?如果没有,您可能会在返回活动后调用onCreate()时将值加倍。