1

私の目標は、2つの数値を2つの別々の数値に入力EditText fieldsし、2つの数値を使用して簡単な計算を行い、three numbers + the date古いエントリも保持しながらリストに追加して、上部のテーブルに別の行を追加できるようにすることです。

 Date1  |  Num1  |  Num2  |  CalculatedNum3 

 Date2  |  Num4  |  Num5  |  CalculatedNum6

上記は、ListViewのデザインの大まかなレイアウトです。

配列、文字列、アダプタを調べましたが、頭を包み込むことができないようです。この状況でどのようにそれらを使用できるか。どんな援助でも大歓迎です。

4

5 に答える 5

1

必要なのはListViewです。ListViewは、与えられたアダプターによって監視されるデータセットに存在する要素に応じて、スクロールする垂直リスト内の子ビューを自動的に並べ替えるビューです。基本的に、3つの部分があります。

  1. 表示するデータを含むデータセット。
  2. そのデータから以下へのインターフェースを提供するアダプター。
  3. データの表示を担当するビュー自体。

定義する必要があるのは、ある種のコレクションからアダプターへのマッピングです。これにより、アダプターは、ListViewに提供する必要のあるデータにアクセスする方法を認識できます。Android SDKにはこの例があり、ListViewチュートリアルもあります。

それ以外に、ListViewにデータを表示する方法は2つあります。文字列を計算し"DateX | Num1 | Num2 | CalculatedNumX"て、各リスト要素をその文字列(最も単純)にすることができます。または、4つ(または7つ)のテキストボックスを使用してカスタムビューを作成し、それぞれに適切なデータを個別に入力することもできます。これはより複雑ですが、テキストのフォーマットと配置の方法に関してより柔軟性があるという利点があります。

于 2012-07-24T04:12:35.357 に答える
1

これを行うには多くの方法がありますが、特定の状況では他の方法よりも優れている方法もあります。

使用するクラスを理解する

別の回答に投稿されているように、次のものが必要になります。

  • あなたのListViewデータを表示するためのいくつかのフレーバーの
  • データの表示を処理するためのある種のアダプター(BaseAdapter問題なく動作します)
  • データを格納する変数(私はお勧めしますArrayList
  • Layoutデータの各セットを1行に表示するカスタム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[]>

3番目の数値を計算するときに、次のような関数を呼び出します。

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、、、Num1Num2CalculatedNum
  2. から拡張するカスタムアダプタBaseAdapter
  3. 内のアイテムのレイアウトListView
  4. を含むメインレイアウトListView
  5. TextView最後に、2つ、2つEditText、1つで構成される主なアクティビティ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

(android_simple_listview_itemの代わりに)ListViewによって使用されているアダプターのgetViewメソッドのオーバーライドでカスタムビューを膨らませるだけです。ケースでは、XMLレイアウトリソースにlayout_weight属性とweigh_sum属性を指定して、ビューの外観を制御します。日付の計算には、DateおよびCalendarJavaクラスを使用するだけです。

于 2012-07-24T04:18:21.637 に答える
0

独自のカスタムアダプタを作成します。独自のレイアウトを作成し、独自のカスタムレイアウトに基づいて作成されたあらゆる種類のアイテムを設定できます。次のリンクをチェックしてください。それは間違いなくあなたを助けます。

基本的なListViewアダプターの使用が完了したら、計算を追加できます。adapt.insert(object, index)上部にレイアウトを追加する場合、1つの方法は、基本的にアイテムを追加する場所のインデックスを提供する場所と呼ばれる関数を使用することです。例として、上記のリンクには。というメソッドがありgetOrders()ます。

于 2012-07-24T04:21:11.577 に答える