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

时间:2015-08-09 18:16:11

标签: android android-arrayadapter

我是一名新的Android开发人员,我需要你的帮助。我创建了一个简单的列表视图。用户可以在listview中添加一些项目(在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;
    }
}

enter image description here

2 个答案:

答案 0 :(得分:2)

您在位置0的视图上应用更改。 当您添加项目时,您还将其添加到位置0,因此整个列表被按下1,新项目将获得已更改的视图。

已编辑的答案
对不起,我的时间很短,但现在我可以更彻底地解决它。

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

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

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

你应该做的如下:
1)确保你的对象有一个布尔成员,该成员说明项目是&#34;罢工&#34;或不。例如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或类似的东西。

答案 1 :(得分:0)

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

@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;

        }

}