将新条目添加到ListView

时间:2012-07-24 03:48:17

标签: android android-linearlayout

我的目标是能够将两个数字输入两个单独的EditText fields,使用这两个数字进行快速计算,并将three numbers + the date添加到列表中,同时保留任何旧条目,以便它将在顶部的表格中添加另一行。

 Date1  |  Num1  |  Num2  |  CalculatedNum3 

 Date2  |  Num4  |  Num5  |  CalculatedNum6

上面将是ListView设计的粗略布局。

我已经研究过数组,字符串和适配器,但我似乎无法绕过它们;我如何在这种情况下使用它们。非常感谢任何帮助。

5 个答案:

答案 0 :(得分:1)

您需要的是ListView。 ListView是一个视图,它根据给定的适配器观察到的数据集中存在的元素,自动在滚动垂直列表中对其子视图进行排序。基本上,有三个部分:

  1. 包含您要显示的数据的数据集。
  2. 适配器,提供从该数据到:
  3. 的接口
  4. 视图本身,负责显示数据。
  5. 您需要定义的是从某种集合到适配器的映射,以便适配器知道如何访问它需要提供给ListView的数据。 Android SDK中有这样的示例,甚至还有ListView Tutorial

    除此之外,有两种方法可以在ListView中显示数据。您可以计算字符串"DateX | Num1 | Num2 | CalculatedNumX",并且只需将每个列表元素设置为该字符串(最简单)。或者,您可以使用4(或7)个文本框创建自定义视图,并使用适当的数据单独填充每个文本框。这更复杂,但其优点是可以更灵活地设置文本的格式和位置。

答案 1 :(得分:1)

有很多方法可以做到这一点,在某些情况下有些方法比其他方法更好。

了解您将使用的课程

如在另一个答案中所述,您将需要:

  • 某种风格的ListView以显示您的数据
  • 某种类型的适配器(BaseAdapter会很好)来处理显示数据
  • 用于存储数据的变量(我建议使用ArrayList
  • 自定义Layout,用于显示ListView
  • 行中的每组数据

将此转化为有效的工作

首先,最简单的方法是让你的组件最后链接起来。首先,您ListView的每一行的布局:

// Very basic layout for a row
public class rowView extends LinearLayout {
    TextView tv1 = null;
    TextView tv2 = null;
    TextView tv3 = null;
    TextView tv4 = null;

    public rowView(Context ct) {
        super(ct);

        // Do some Layout settings as needed
        setOrientation(LinearLayout.HORIZONTAL);

        // Create and configure TextViews
        tv1 = new TextView(ct);
        tv2 = new TextView(ct);
        tv3 = new TextView(ct);
        tv4 = new TextView(ct);

        tv1.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1.0f));
        tv2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1.0f));
        tv3.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1.0f));
        tv4.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1.0f));

    // Add the views to the layout
        addView(tv1);
        addView(tv2);
        addView(tv3);
        addView(tv4);
    }
}

接下来是您的数据显示,您将其链接到EditText等的方式会有所不同。但是这里有一些关于如何使用ArrayList<String[]>的想法。

当你计算第三个数字时,你可以调用如下函数:

public void addData(String date, String num1, String num2, String calculatedNum) {
    String[] s = new String[4];

    s[0] = date;
    s[1] = num1;
    s[2] = num2;
    s[3] = calculatedNum;

    arrayListofStrings.add(s);
}

现在存储您的数据。最后一个主要步骤就是创建适配器,您必须将其设置为正确“让ListView正确地与您的数据对话”。看到您的新数据被添加到ArrayList的末尾(这比尝试将其添加到开头要容易得多),您所要做的就是按顺序翻转适配器中的顺序:

public class myAdapter extends BaseAdapter {

    public int getCount() {
        return arrayListofStrings.size();
    }

    public Object getItem(int position) {
        // Returns the strings in REVERSE order
        return arrayListofStrings.get(arrayListofStrings.size() - 1 - position);
    }

    public long getItemId(int position) {
        // Not concerned with this
        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        // Here is the version for memory optimization (aka view recycling). This should be habit

        rowView ret = null;

        if (convertView == null) {
            // Create a new view
            ret = new rowView(getApplicationContext());
        } else {
            // Cast and reuse
            ret = (rowView) convertView;
        }

        // Get the data
        String[] data = (String[]) getItem(position);

        // Update the row with the data
        ret.tv1.setText(data[0]);
        ret.tv2.setText(data[1]);
        ret.tv3.setText(data[2]);
        ret.tv4.setText(data[3]);

        return ret;
    }
}

最后一步只是创建您需要它的ListView,创建Adapter并将ListView附加到{{1}}以及其他小事(例如将您的值投射到字符串等)。

这绝不是一个有效的解决方案,只是想到了什么样的想法以及你需要做什么。

注意:每当您更改数据时,请确保致电 BaseAdapter.notifyDataSetChanged

答案 2 :(得分:1)

以下是您的需求:

  1. 一个类包含这些数据:Date1Num1Num2CalculatedNum
  2. BaseAdapter
  3. 延伸的自定义适配器
  4. ListView
  5. 中项目的布局
  6. 主要布局,其中包含ListView
  7. 最后,主要活动由两个TextView,两个EditText和一个Button组成。
  8. 这是设置ListView的最基本框架,当然您可以在代码中实现所有视图,但尝试遵循此模式。它将使您的代码更清晰,更容易适应布局的变化。

    <强>#1

    package com.example.demo;
    
    public class Data {
        private int mX;
        private int mY;
        private int mSum;
        private String mDate;
    
        public Data(int x, int y, int sum, String date) {
            mX = x;
            mY = y;
            mSum = sum;
            mDate = date;
        }
    
        public int getX() {
            return mX;
        }
    
        public int getY() {
            return mX;
        }
    
        public int getSum() {
            return mSum;
        }
    
        public String getDate() {
            return mDate;
        }
    }
    

    <强>#2

    package com.example.demo;
    
    import java.util.List;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    
    public class DemoAdapter extends BaseAdapter {
        private Context mContext;
        private List<Data> mItems;
        private ViewHolder mHolder;
    
        private static LayoutInflater mInflater = null;
    
        public DemoAdapter(Context context, List<Data> items) {
            mContext = context;
            mItems = items;
            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        public int getCount() {
            return mItems.size();
        }
    
        public Object getItem(int position) {
            return mItems.get(position);
        }
    
        public long getItemId(int position) {
            return position;
        }
    
        public static class ViewHolder {
            TextView x;
            TextView y;
            TextView sum;
            TextView date;
        }
    
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.list_item, null);
                mHolder = new ViewHolder();
                mHolder.x = (TextView) convertView.findViewById(R.id.text_x);
                mHolder.y = (TextView) convertView.findViewById(R.id.text_y);
                mHolder.sum = (TextView) convertView.findViewById(R.id.text_sum);
                mHolder.date = (TextView) convertView.findViewById(R.id.text_date);
                convertView.setTag(mHolder);
            }
            else {
                mHolder = (ViewHolder) convertView.getTag();
            }
    
            mHolder.x.setText(Integer.toString(mItems.get(position).getX()));
            mHolder.y.setText(Integer.toString(mItems.get(position).getY()));
            mHolder.sum.setText(Integer.toString(mItems.get(position).getSum()));
            mHolder.date.setText(mItems.get(position).getDate());
            return convertView;
        }
    }
    

    <强>#3

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >
    
        <TextView
            android:id="@+id/text_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:layout_weight="0.3"
            android:text="date">
        </TextView>
    
        <TextView
            android:id="@+id/text_x"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:layout_weight="0.2"
            android:text="x">
        </TextView>
    
        <TextView
            android:id="@+id/text_y"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:layout_weight="0.2"
            android:text="y">
        </TextView>
    
        <TextView
            android:id="@+id/text_sum"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:layout_weight="0.3"
            android:text="sum">
        </TextView>
    
    </LinearLayout>
    

    <强>#4

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Num 1" />
    
            <EditText
                android:id="@+id/edit_x"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="23dp"
                android:ems="10"
                android:inputType="number" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Num 2" />
    
            <EditText
                android:id="@+id/edit_y"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="22dp"
                android:ems="10"
                android:inputType="number" >
    
                <requestFocus />
            </EditText>
        </LinearLayout>
    
        <Button 
            android:id="@+id/button_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add"/>
    
        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </ListView>
    
    </LinearLayout>
    

    <强>#5

    package com.example.demo;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.os.Bundle;
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.support.v4.app.NavUtils;
    
    public class MainActivity extends Activity {
        private List<Data> mData;
        private ListView mListView;
        private DemoAdapter mAdapter;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setupListView();
    
            Button add = (Button) findViewById(R.id.button_add);
            add.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    EditText editX = (EditText) findViewById(R.id.edit_x);
                    EditText editY = (EditText) findViewById(R.id.edit_y);
    
                    int x = Integer.parseInt(editX.getText().toString());
                    int y = Integer.parseInt(editY.getText().toString());
    
                    mData.add(new Data(x, y, x + y, "02/33/2033"));
                    // add new data to list and refresh
                    mAdapter.notifyDataSetChanged();
                }
            });
        }
    
        private void prepareDummyData() {
            mData = new ArrayList<Data>();
            mData.add(new Data(1, 2, 3, "07/22/2012"));
            mData.add(new Data(2, 3, 5, "07/23/2012"));
        }
    
        private void setupListView() {
            // add some data
            prepareDummyData();
            mListView = (ListView) findViewById(R.id.listview);
            mAdapter = new DemoAdapter(this, mData);
            mListView.setAdapter(mAdapter);
        }
    }
    

答案 3 :(得分:0)

只需在ListView使用的适配器上覆盖getView的自定义视图(而不是android_simple_listview_item)。在您的案例中,在XML布局资源上提供layout_weight和weigh_sum属性以控制视图的外观。只需使用Date和Calendar java类来计算日期。

答案 4 :(得分:0)

编写自己的自定义适配器。您将创建自己的布局,您可以在其中设置基于您自己的自定义布局创建的任何类型的项目。请查看以下link。这肯定会对您有所帮助。

完成基本的ListView适配器后,您可以添加计算。要在顶部添加布局,一种方法是使用名为adapt.insert(object, index)的函数,其中您基本上提供了添加项目的位置的索引。例如,上面给出的链接有一个名为getOrders()的方法。