在简单列表项中保存项目的状态

Saved item's state in simple list item

我是一名新 android 开发人员,我需要您的帮助。我创建了一个简单的列表视图。用户可以在列表视图中添加一些项目(键入 EditText 并单击 Button "OK")。当用户点击 onItemClick 时,应用程序将删除文本并将背景设置为绿色。

但是,当我再添加一项时,我看到它应用了上一项中的删除线和背景选项。

你能告诉我在这种情况下我需要做什么吗?如何改进?

package com.example.boytsov.foodbasketapp;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Boytsov on 23.07.2015.
 */
public class ProductList extends Activity implements View.OnClickListener,AdapterView.OnItemClickListener,AdapterView.OnItemLongClickListener,TextView.OnEditorActionListener {
    EditText myText;

    ListView lvMain;
    ArrayList<String> catnames;
    ArrayAdapter<String> adapter;
    Button button;
    DataBase db;
    final String LOG_TAG = "myLogs";
    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.productlist);
        db = new DataBase(this);
        myText = (EditText)findViewById(R.id.editText);
        lvMain = (ListView) findViewById(R.id.lvMain);
        button=(Button)findViewById(R.id.button);

        catnames= new ArrayList<String>();
        // создаем адаптер
        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, catnames);

        // присваиваем адаптер списку
        lvMain.setAdapter(adapter);
        lvMain.setOnItemClickListener(this);
        lvMain.setOnItemLongClickListener(this);
        // Прослушиваем нажатия клавиш
        button.setOnClickListener(this);
        //слушаем edittext
        myText.setOnEditorActionListener(this);



    }

    @Override
    public void onClick(View view) {

        switch (view.getId()){
            case R.id.button : {
                //TextView myText = (TextView) view;
                catnames.add(0, myText.getText().toString());
                adapter.notifyDataSetChanged();

                //myText.setBackgroundColor(Color.TRANSPARENT);
                //myText.setPaintFlags(0);
                Log.d("Insert: ", "Inserting ..");
                db.addProduct(new Product(myText.getText().toString()));

                myText.setText("");
                Log.d("Reading: ", "Reading all contacts..");
                List<Product> products = db.getAllProducts();

                for (Product cn : products) {
                    String log = "Id: "+cn.getID_product()+" ,Name: " + cn.getName_product();
                    // Writing Contacts to log
                    Log.d("Name: ", log);
                }
            }

        break;

            }

    }



    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

        TextView textview= (TextView) view;
        if (textview.getPaintFlags() != 16){
            textview.setPaintFlags(16);
            textview.setBackgroundColor(Color.parseColor("#77dd77"));
            Toast.makeText(this, "Куплено", Toast.LENGTH_SHORT).show();
            adapter.notifyDataSetChanged();
            Log.d(LOG_TAG, "itemClick: position = " + i + ", id = "
                    + l);
         } else {
            textview.setPaintFlags(0);
            textview.setBackgroundColor(Color.TRANSPARENT);
            Toast.makeText(this, "Не куплено", Toast.LENGTH_SHORT).show();
                }
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        catnames.remove(position);
        adapter.notifyDataSetChanged();
        Toast.makeText(this, "Удалено", Toast.LENGTH_SHORT).show();

        Log.d(LOG_TAG, "onItemClick: position = " + position + ", id = "
                + id);
        return true;
    }


    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            Log.d(LOG_TAG, "onItemClick: position = " + actionId + ", id = "
                    + event);
            handled = true;
        }
        return handled;
    }
}

我真的不知道这是否是正确的答案,但这是一个建议:

@Override
public void onClick(View view) {

    switch (view.getId()){
        case R.id.button : {
            //TextView myText = (TextView) view;
            catnames.add(0, myText.getText().toString());
            View view = listView.getChildAt(0);
            TextView textview= (TextView) view;
            textview.setBackgroundColor(Color.TRANSPARENT);
            adapter.notifyDataSetChanged();

            //myText.setBackgroundColor(Color.TRANSPARENT);
            //myText.setPaintFlags(0);
            Log.d("Insert: ", "Inserting ..");
            db.addProduct(new Product(myText.getText().toString()));

            myText.setText("");
            Log.d("Reading: ", "Reading all contacts..");
            List<Product> products = db.getAllProducts();

            for (Product cn : products) {
                String log = "Id: "+cn.getID_product()+" ,Name: " + cn.getName_product();
                // Writing Contacts to log
                Log.d("Name: ", log);
            }
        }

    break;

        }

}

您将更改应用到位置 0 的视图。 当你添加你的项目时,你也将它添加到位置 0,因此整个列表被向下推 1,新项目获得已经改变的视图。

已编辑答案
抱歉,我的时间不够,但现在我可以更彻底地解决它。

您必须了解的一件重要事情是,在列表视图中显示您的数据的视图不一定与您的数据相对应。

如果您单击列表中的项目并更改其视图属性,它不会更改表示数据的项目或对象的状态,但视图本身。

例如,如果您单击位置 0 处的项目,它将更改位置 0 处的视图背景。然后,在您的示例中,您在列表顶部添加一个项目,这会将新创建的对象置于位置0(已经修改过的视图)并将 已创建数据的其余部分 推一个,你最终会在位置 0 处得到一个已经更改的视图,在位置 0 处有新数据。

你应该做的是:
1)确保你的对象有一个布尔成员,它说明项目是否为 "strike out" 。例如 mIsStrikeOut.
2) 从任何 android 适配器创建自定义适配器,例如 ArrayAdapter.
3)覆盖它的getView方法,例如:

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

    if (view == null)
    {
      view = (LinearLayout) inflater.inflate(R.layout. simple_list_item_1, parent, false);
    }

    TextView textview = (TextView) view.findViewById(R.id.text1);

    if (catnames.get(position).isStrikeOut())
    {
        textview.setPaintFlags(16);
        textview.setBackgroundColor(Color.parseColor("#77dd77"));
        Toast.makeText(this, "Куплено", Toast.LENGTH_SHORT).show();
        Log.d(LOG_TAG, "itemClick: position = " + i + ", id = "
                + l);
    }
    else
    {
        textview.setPaintFlags(0);
        textview.setBackgroundColor(Color.TRANSPARENT);
        Toast.makeText(this, "Не куплено", Toast.LENGTH_SHORT).show();
    }
 return view;

}

旁注: 当您从数据库查询数据时,请确保顺序正确,我会建议 ORDER BY id dec 或类似的东西。