1

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

 Date1  |  Num1  |  Num2  |  CalculatedNum3 

 Date2  |  Num4  |  Num5  |  CalculatedNum6

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

我研究过数组、字符串和适配器,但我似乎无法理解它们;我如何在这种情况下使用它们。任何帮助将不胜感激。

4

5 回答 5

1

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

  1. 包含要显示的数据的数据集。
  2. 适配器提供从该数据到的接口:
  3. 视图本身,负责显示数据。

您需要定义的是从某种集合到适配器的映射,以便适配器知道如何访问它需要提供给 ListView 的数据。Android SDK 中有这方面的示例,甚至还有ListView 教程

除此之外,还有两种方法可以在 ListView 中显示数据。您可以计算字符串"DateX | Num1 | Num2 | CalculatedNumX"并让每个列表元素成为该字符串(最简单)。或者,您可以创建一个包含 4 个(或 7 个)文本框的自定义视图,并使用适当的数据单独填充每个文本框。这更复杂,但其优势在于为文本的格式和位置提供了更多的灵活性。

于 2012-07-24T04:12:35.357 回答
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和其他次要的东西(比如将你的值转换为字符串等)。

这绝不是一个可行的解决方案,只是其中包含什么样的想法以及您需要做什么的胆量。

注意:无论何时更改数据,请确保调用 BaseAdapter.notifyDataSetChanged

于 2012-07-24T05:00:05.687 回答
1

这是您需要的:

  1. 一个类包含这些数据:Date1, Num1, Num2,CalculatedNum
  2. 一个自定义适配器,从BaseAdapter
  3. 内项目的布局ListView
  4. 主布局,其中包含ListView
  5. 最后,主要活动由二TextView、二EditText和一组成Button

这是设置 的最基本的框架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);
    }
}
于 2012-07-24T05:09:02.290 回答
0

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

于 2012-07-24T04:18:21.637 回答
0

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

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

于 2012-07-24T04:21:11.577 回答