2016-08-18 7 views
0

これはHow to get current timestamp in Android without it updating like a clockで一度だけ尋ねられましたが、回答としてマークされておらず、いくつかの提案が理解できません。SimpleDateFormatが時刻を更新しないようにするにはどうすればいいですか

とにかく、私はJavaにはまだまらず、単純なTodoアプリ(https://guides.codepath.com/android/Basic-Todo-App-Tutorial)を作成するためのチュートリアルに続き、各リスト項目にタイムスタンプを追加しようと決めました。私はそれが現在の時間を追加する限りそれを取得しましたが、静的ではありません。新しいアイテムを追加しようとしたとき、またはアプリケーションを閉じて再オープンしたときに、いつでも更新されています。答えはどこにあるのか分かりません。 This is what I get

をこれは私が欲しいものです:: This is what I want

は、ここでは、コードです

これは私が取得していますものです。 MainActivity.java

public class MainActivity extends AppCompatActivity { 

private ArrayList<String> items; 
private ArrayAdapter<String> TodoAdapter; 
private ListView lvItems; 

private void readItems() { 
    File filesDir = getFilesDir(); 
    File todoFile = new File(filesDir, "todo.txt"); 
    try { 
     items = new ArrayList<String>(FileUtils.readLines(todoFile)); 
    } catch (IOException e) { 
     items = new ArrayList<String>(); 
    } 
} 

private void writeItems() { 
    File filesDir = getFilesDir(); 
    File todoFile = new File(filesDir, "todo.txt"); 
    try { 
     FileUtils.writeLines(todoFile, items); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    items = new ArrayList<String>(); 
    readItems(); 
    TodoAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_2, android.R.id.text1, items); 
    lvItems = (ListView) findViewById(R.id.lvItems); 
    lvItems.setAdapter(TodoAdapter); 
    // Setup remove listener method call 
    setupListViewListener(); 
} 

// Attaches a long click listener to the listview 
// Removes item on long press 
private void setupListViewListener() { 
    lvItems.setOnItemLongClickListener(
      new AdapterView.OnItemLongClickListener() { 
       @Override 
       public boolean onItemLongClick(AdapterView<?> adapter, View item, int pos, long id) { 
        // Remove the item within array at position 
        items.remove(pos); 
        // Refresh the adapter 
        TodoAdapter.notifyDataSetChanged(); 
        writeItems(); 
        // Return true consumes the long click event (marks it handled) 
        return true; 
       } 

      }); 
} 

public void onAddItem(View v) { 
    EditText etNewItem = (EditText) findViewById(R.id.etNewItem); 
    String itemText = etNewItem.getText().toString(); 
    TodoAdapter.add(itemText); // Add items to new Adapter type 
    etNewItem.setText(""); 
    writeItems(); 
} 
} 

TodoAdapter.java

public class TodoAdapter extends ArrayAdapter<Todo> { 
    public TodoAdapter(Context context, ArrayList<Todo> items) { 
     super(context, 0, items); 
    } 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Todo item = getItem(position); 

    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_2, parent, false); 
    } 

    TextView text1 = (TextView) convertView.findViewById(android.R.id.text1); 
    TextView text2 = (TextView) convertView.findViewById(android.R.id.text2); 

    text1.setText(item.itemText); 
    text2.setText(item.getCreationTimeString()); 
    text2.setTextSize(10); 

    return convertView; 
    } 
} 

Todo.java

public class Todo { 
    String itemText; 
    private Date creationTime; 

    public Todo(String text) { 
     this.itemText = text; 
     this.creationTime = new Date(); 
    } 

    public String getCreationTimeString() { 
     return new SimpleDateFormat("h:mm a").format(creationTime); 
    } 
} 

提供すべてのヘルプは非常にいただければ幸いです。また、文字通り私が何をしているのかほとんど理解していないことを覚えておいてください。 :)

+2

'new Date()'は、呼び出された時点の現在の日付/時刻を常に返します。 – GriffeyDog

+0

'new Date()'は常に現在のシステム時刻を使用します。 – Zircon

+0

ファイル内にタスクの作成日を保存する必要があります –

答えて

0

時間はアダプタが常にビューであることを、現在の時刻を取得しますれ、new Date()をリコールされているため、つまり、私がしようとすると、新しいアイテム

右を追加いつでも更新し続けますアダプター項目用に作成されます。

アイテムが作成された時刻に関連付けられているように見えます。その場合は、あなたはその後、あなたはおそらくmake an ArrayAdapter<Todo>これらの項目を表示し、この

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Todo item = getItem(position); 

    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_2, parent, false); 
    } 

    TextView text1 = (TextView) convertView.findViewById(android.R.id.text1); 
    TextView text2 = (TextView) convertView.findViewById(android.R.id.text2); 

    text1.setText(item.itemText); 
    text2.setText(item.getCreationTimeString()); 
    text2.setTextSize(10); 

    return convertView; 
} 

のようなものを表示し、addメソッド

public void onAddItem(View v) { 
    EditText etNewItem = (EditText) findViewById(R.id.etNewItem); 
    String itemText = etNewItem.getText().toString(); 
    itemsAdapter.add(new Todo(itemText)); // Add items to new Adapter type 
    etNewItem.setText(""); 
    writeItems(); 
} 
を更新する必要があるクラス

public class Todo { 
    String itemText; 
    private Date creationTime; 

    public Todo(String text) { 
     this.itemText = text; 
     this.creationTime = new Date(); 
    } 

    public String getCreationTimeString() { 
     return new SimpleDateFormat("h:mm a").format(creationTime); 
    } 
} 

を作ることができます

+0

これを行うと、コードを初めて実行してからの時間が使用されるようになります。今はすべてのアイテムが4:48 pmに表示されています。 – Bradbains

+0

それはあなたが望むものではありませんか?あなたは静的なタイムスタンプが必要だと言った... –

+0

申し訳ありませんが、私は各項目の静的な意味です。具体的には、各アイテムを追加するときの静的なスタンプが必要です。アイテムは午後4時54分の時刻を示し、2分後に2番目のアイテムを追加すると、そのアイテムは4:56の時間で表示されます。もっと明確ですか? – Bradbains

関連する問題