2012-07-24 76 views
1

我的目标是能够将两个数字输入到两个单独的EditText fields中,使用这两个数字快速计算,并将three numbers + the date添加到列表中,同时保留所有旧条目,以便它将添加另一排在顶部的桌子上。向ListView添加新条目

Date1 | Num1 | Num2 | CalculatedNum3 

Date2 | Num4 | Num5 | CalculatedNum6 

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

我已经看着数组,字符串和适配器,但我似乎无法将我的头包裹在它们周围;在这种情况下我如何使用它们。任何援助将不胜感激。

+2

你做了什么至今? – Dharmendra 2012-07-24 04:06:33

回答

1

这里有你需要的东西:

  1. 类包含这些数据:Date1Num1Num2CalculatedNum
  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); 
    } 
} 
1

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

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

您需要定义的是从某种集合到适配器的映射,以便适配器知道如何访问它需要给予ListView的数据。在Android SDK中有这样的例子,甚至有一个ListView Tutorial

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

0

只需在ListView(而不是android_simple_listview_item)所使用的适配器上覆盖getView方法的自定义视图上进行膨胀。在您的案例中提供XML布局资源上的layout_weight和weight_sum属性以控制视图的外观。只需使用日期和日历Java类来计算日期。

0

编写您自己的自定义适配器。您将创建自己的布局,您可以在其中设置根据您自己的自定义布局创建的任何类型的项目。看看下面的link。它肯定会帮助你。

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

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