我是否正确创建了我的自定义

我是否正确创建了我的自定义

本文介绍了我是否正确创建了我的自定义 ArrayAdapter?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 ListView 可以正确填充,但由于某种原因添加和删除很奇怪并且无法正常工作!我做错了什么吗?

My ListView populates correctly, but for some reason adding and removing is quirky and does not work properly! Am I doing something wrong?

在 OnCreate() 中设置

Set things up in OnCreate()

listView = (ListView) findViewById(R.id.ListView);

        registerForContextMenu(listView);

        deserializeQuotes();

        if(quotes == null || quotes.size() == 0){
            quotes = new ArrayList<Quote>();
            //populateDefaultQuotes();
            //serializeQuotes();
            //getQuotesFromYQL();
        }

        this.quotesAdapter = new QuoteAdapter(this, R.layout.mainrow, quotes);
        listView.setAdapter(this.quotesAdapter);

        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                deserializeQuotes();
                Quote myQuote = quotes.get(position);
                Toast toast = Toast.makeText(getApplicationContext(), myQuote.getName(), Toast.LENGTH_SHORT);
                toast.show();
            }
        });

引用适配器私有类

private class QuoteAdapter extends ArrayAdapter<Quote> {

        private ArrayList<Quote> items;

        public QuoteAdapter(Context context, int textViewResourceId,
                ArrayList<Quote> items) {
            super(context, textViewResourceId, items);
            this.items = items;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.mainrow, null);
            }
            Quote q = items.get(position);
            if (q != null) {
                TextView nameText = (TextView) v.findViewById(R.id.nameText);
                TextView priceText = (TextView) v.findViewById(R.id.priceText);
                TextView changeText = (TextView) v.findViewById(R.id.changeText);

                if (nameText != null) {
                    nameText.setText(q.getSymbol());
                }
                if (priceText != null) {
                    priceText.setText(q.getLastTradePriceOnly());
                }
                if (changeText != null) {
                    changeText.setText(q.getChange());
                }
            }
            return v;
        }
    }

从列表中删除一个项目(这不起作用,什么也不做)

@Override
    public boolean onContextItemSelected(MenuItem item) {
        if(item.getTitle()=="Remove"){
            deserializeQuotes();
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
            quotesAdapter.remove(quotes.get(info.position));
            quotesAdapter.notifyDataSetChanged();
            serializeQuotes();
        }
        else {
            return false;
        }

        return true;
    }

将项目添加到列表中(此作品)

Add an item to the list (THIS WORKS)

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        deserializeQuotes();
        this.quotesAdapter = new QuoteAdapter(this, R.layout.mainrow, quotes);
        quotesAdapter.notifyDataSetChanged();
        listView.setAdapter(quotesAdapter);
    }
}

这是我如何序列化和反序列化

Here is how I serialize and deserialize

private void serializeQuotes(){
        FileOutputStream fos;
        try {
            fos = openFileOutput(Constants.FILENAME, Context.MODE_PRIVATE);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(quotes);
            oos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    @SuppressWarnings("unchecked")
    private void deserializeQuotes(){
        try{
            FileInputStream fis = openFileInput(Constants.FILENAME);
            ObjectInputStream ois = new ObjectInputStream(fis);
            quotes = (ArrayList<Quote>) ois.readObject();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }

推荐答案

代码似乎没问题.您可以尝试在删除时使用它吗?:

The code seems to be alright. Can you try using this in your remove?:

if("Remove".equals(item.getTitle())) {
   //....
}

我刚刚注意到您正在通过调用 deserializeQuotes() 来反序列化Quote"对象.您是否覆盖了 Quote 对象的 boolean equals(Object) 方法?当您反序列化时,创建的对象不是相同的",即它们完全是新对象,并且如果您没有覆盖 equals 方法:

I just noticed you are de-serializing "Quote" objects by calling deserializeQuotes(). Have you overridden the boolean equals(Object) method of Quote object? When you de-serialize, the object created are not the "same", i.e. they are new objects altogether and if you haven't overridden the equals method:

quotesAdapter.remove(quotes.get(info.position));

将失败,因为它不会在列表中找到任何要删除的 Quote 对象.

will fail because it won't find any Quote object to remove in the list.

你能检查一下吗?

这篇关于我是否正确创建了我的自定义 ArrayAdapter?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-03 01:19