2016-08-18 3 views
0

Ich sah, dass dies einmal um How to get current timestamp in Android without it updating like a clock gebeten wurde, aber es wurde nicht als beantwortet markiert und ich verstehe nicht die wenigen Vorschläge, die gegeben wurden.Wie kann ich SimpleDateFormat von der Aktualisierung der Zeit stoppen

Wie auch immer, ich bin neu in Java und folgte einem Tutorial auf eine einfache Todo-App (https://guides.codepath.com/android/Basic-Todo-App-Tutorial) und ich beschloss, einen Zeitstempel zu jedem Listenelement hinzuzufügen. Ich habe bis jetzt die aktuelle Zeit hinzugefügt, aber es ist nicht statisch. Die Zeit wird immer aktualisiert, wenn ich versuche, ein neues Element hinzuzufügen oder wenn ich die App schließe und erneut öffne. Ich kann die Antwort nirgendwo finden/finden. Diese

ist das, was ich bekomme: This is what I get

Dies ist, was ich will: This is what I want

Hier ist der Code ist. 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); 
    } 
} 

Jede vorgesehen Hilfe werden sehr geschätzt würde. Bitte bedenke auch, dass ich buchstäblich kaum verstehe, was ich mache. :)

+2

'new Date()' gibt immer das aktuelle Datum/Uhrzeit zum Zeitpunkt des Aufrufs zurück. – GriffeyDog

+0

'new Date()' verwendet immer die aktuelle Systemzeit. – Zircon

+0

Sie müssen das Erstellungsdatum der Aufgabe in der Datei speichern –

Antwort

0

Die Zeit jederzeit aktualisieren hält Ich versuche, und fügen Sie ein neues Objekt

Richtig ist, dass, weil der Adapter new Date() erinnert wird, was wird immer die aktuelle Zeit erhalten, dass der View ist erstellt für ein Adapterelement.

Es scheint, dass Elemente mit einer Zeit verknüpft werden sollen, zu der sie erstellt werden. Wenn das der Fall ist, dann können Sie eine Klasse machen

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); 
    } 
} 

Dann sollten Sie wahrscheinlich make an ArrayAdapter<Todo> diese Elemente angezeigt werden und so etwas wie dieses

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(); 
} 

@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; 
} 

und aktualisieren Sie die Add-Methode anzuzeigen

+0

Wenn ich das tue, verwendet es jetzt die Zeit von der ersten Zeit, in der der Code ausgeführt wird. Jetzt erscheinen alle Artikel als 4:48 Uhr. – Bradbains

+0

Ist das nicht das, was du willst? Du hast gesagt, du wolltest einen statischen Zeitstempel ... –

+0

Entschuldigung, ich meinte statisch für jeden Gegenstand. Insbesondere möchte ich einen statischen Stempel, wenn ich jeden Artikel hinzufüge. Der Gegenstand zeigt also eine Zeit von 4:54 pm. Wenn ich dann zwei Minuten später einen zweiten Gegenstand hinzufüge, sollte dieser Gegenstand mit einer Zeit von 4:56 angezeigt werden. Ist das klarer? – Bradbains

Verwandte Themen