将新项目添加到 Listview 时保存适配器数组

Save adapter array when new item added to Listview

刚开始学习Android。我不确定我的问题是否正确。我的目的是当用户按下按钮将项目添加到列表视图时。每个单项(行)有 3 个输入。目前我的代码在按下按钮时添加项目(行)。但是它创建了新数组并删除了所有用户输入。我也几乎不知道 Java(几乎没有 OOP 技能)。你能回答我做错了什么吗?

Activity:

    package com.example.gereltod.test7;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;

import java.util.ArrayList;

public class SellActivity extends Activity {

    ArrayList<Items> items = new ArrayList<Items>();
    ItemsAdapter adapter;
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

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

        adapter = new ItemsAdapter(this, items);
        listView = (ListView) findViewById(R.id.listView_main);
        listView.setAdapter(adapter);
    }

    public void add_item(View view) {

        Log.i("clicked add item", "yes");

        items.add(new Items("", "", ""));
        adapter.notifyDataSetChanged();
    }
}

布局

<ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView_main"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/btn_add_item" />


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn_add_item"
        android:id="@+id/btn_add_item"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:onClick="add_item" />

项目适配器

package com.example.gereltod.test7;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class ItemsAdapter extends ArrayAdapter<Items> {

    private static class ViewHolder {
        TextView name;
        TextView qty;
        TextView price;
    }

    public ItemsAdapter(Context context, ArrayList<Items> items) {
        super(context, 0, items);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get the data item for this position
        Items items = getItem(position);
        // Check if an existing view is being reused, otherwise inflate the view
        ViewHolder viewHolder; // view lookup cache stored in tag
        if (convertView == null) {
//            convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.list_item, parent, false);
            viewHolder.name = (TextView) convertView.findViewById(R.id.edittxt_name);
            viewHolder.qty = (TextView) convertView.findViewById(R.id.edittxt_qty);
            viewHolder.price = (TextView) convertView.findViewById(R.id.edittxt_price);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.name.setText(items.name);
        viewHolder.qty.setText(items.qty);
        viewHolder.price.setText(items.price);
        return convertView;
    }
}

列表项

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:layout_weight="1">

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp">

        <EditText
            android:id="@+id/edittxt_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:background="@drawable/input_shape"
            android:hint="@string/hint_item_name"
            android:padding="5dp"
            android:singleLine="true" />

        <EditText
            android:id="@+id/edittxt_qty"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="0.2"
            android:background="@drawable/input_shape"
            android:gravity="right"
            android:hint="@string/hint_item_qty"
            android:inputType="number"
            android:padding="5dp"
            android:singleLine="true" />

        <EditText
            android:id="@+id/edittxt_price"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="0.3"
            android:background="@drawable/input_shape"
            android:gravity="end"
            android:hint="@string/hint_item_price"
            android:inputType="number"
            android:padding="5dp"
            android:singleLine="true" />
    </TableRow>
</TableLayout>

编辑:由于我的英语很烂,我无法准确描述发生了什么。所以我添加了屏幕截图。看这里:http://i.imgur.com/Yzw2s7D.jpg

在您的 add_item 方法中,您不应创建新的适配器和对 listView 的新引用。在你的 onCreate() 方法中移动这些行

ItemsAdapter adapter = new ItemsAdapter(this, items);
ListView listView = (ListView) findViewById(R.id.listView_main);
listView.setAdapter(adapter);

add_item 应该只添加项目和 notifyDataSetChanged()。

我不确定,但试试这个

package com.example.gereltod.test7;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import java.util.ArrayList;

public class SellActivity extends Activity {

    ArrayList<Items> items = new ArrayList<Items>();
    ItemsAdapter adapter;
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

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

        adapter = new ItemsAdapter(this, items);
        listView = (ListView) findViewById(R.id.listView_main);
        listView.setAdapter(adapter);

    }

    public void add_item(View view) {

        Log.i("clicked add item", "yes");

        items.add(new Items("", "", ""));
        adapter.notifyDataSetChanged();
    }
}

我觉得这应该有用...

你每次都在创建一个新列表并向列表中添加一个项目,然后将单个列表的适配器设置为列表视图。

在 activity 创建时设置适配器,然后将项目添加到适配器并调用 notifyDataSetChanged() 方法。这是 activity 的代码:

public class SellActivity extends Activity {

   ArrayList<Items> items = new ArrayList<Items>();

   private ItemsAdapter adapter;

   @Override
   protected void onCreate(Bundle savedInstanceState) {

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

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

       adapter = new ItemsAdapter(this);
       listView.setAdapter(adapter);
   }

   public void add_item(View view) {

       Log.i("clicked add item", "yes");

       adapter.add(new Items("", "", ""));

       adapter.notifyDataSetChanged();
   }
}

您必须更改此方法。首先将您的适配器初始化为

onCreate() { 
   adapter = new ItemsAdapter(this, items); 
   listView = (ListView) findViewById(R.id.listView_main);
   listView.setAdapter(adapter);
}

ItemsAdapter adapter;
ListView listView;
public void add_item(View view) {
    Log.i("clicked add item", "yes");
    items.add(new Items("", "", ""));

    listView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}

我认为您没有将从输入获取的信息设置到数组列表中,所以它里面没有任何信息。