我的目标是能够将两个数字输入两个单独的EditText fields
,使用这两个数字进行快速计算,并将three numbers + the date
添加到列表中,同时保留任何旧条目,以便它将在顶部的表格中添加另一行。
Date1 | Num1 | Num2 | CalculatedNum3
Date2 | Num4 | Num5 | CalculatedNum6
上面将是ListView设计的粗略布局。
我已经研究过数组,字符串和适配器,但我似乎无法绕过它们;我如何在这种情况下使用它们。非常感谢任何帮助。
答案 0 :(得分:1)
您需要的是ListView。 ListView是一个视图,它根据给定的适配器观察到的数据集中存在的元素,自动在滚动垂直列表中对其子视图进行排序。基本上,有三个部分:
您需要定义的是从某种集合到适配器的映射,以便适配器知道如何访问它需要提供给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)
以下是您的需求:
Date1
,Num1
,Num2
,CalculatedNum
BaseAdapter
ListView
ListView
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);
}
}
答案 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()
的方法。