2016-08-10 6 views
-3

Я хочу добавить timeStamp в listView, чтобы он показывал вам, когда этот предмет был создан в этом коде. Есть ли способ, я могу это сделать. если кто-то знает, как это сделать, пожалуйста, дайте мне знать. to_do_item_layoutКак добавить отметку времени к представлению списка?

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<CheckBox 
    android:id="@+id/checkBox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

<TextView 
    android:id="@+id/item" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:textSize="20sp"/> 

<ImageButton 
    android:id="@+id/delete_Button" 
    android:src="@drawable/delete_item_button" 
    android:background="@android:color/transparent" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:contentDescription="@string/delete_item"/> 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/timeStamp" 
    /> 

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper { 
public static final String DATABASE_NAME = "todo.db"; 
public static final int DATABASE_VERSION = 1; 
public static final String ITEMS_TABLE = "items"; 

private static DatabaseHelper instance = null; 

public static DatabaseHelper getInstance(Context context) { 

    if(instance == null) { 
     instance = new DatabaseHelper(context); 
    } 
    return instance; 
} 

private DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    String createQuery = "CREATE TABLE " + ITEMS_TABLE + " (" + 
      "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
      "description TEXT NOT NULL, " + 
      "completed INTEGER NOT NULL DEFAULT 0)"+ 
      "timeStamp INTEGER NOT NULL)"; 
    db.execSQL(createQuery); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)  { 

} 

} 

кнопка работает нормально, но не удаляет permently я не знаю, если это код или если он где я размещаю его в своем MainActivity, если кто-то, пожалуйста, скажет, что это было бы очень оценено.

MainActivity.java

public class MainActivity extends AppCompatActivity { 

private static final String LOG_TAG = "ToDoApp"; 

private ToDoListManager listManager; 
private ToDoItemAdapter adapter; 

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

    ListView todoList = (ListView) findViewById(R.id.todo_list); 

    listManager = new ToDoListManager(getApplicationContext()); 

    adapter = new ToDoItemAdapter(
      this, 
      listManager.getList() 
    ); 

    todoList.setAdapter(adapter); 

    ImageButton addButton = (ImageButton) findViewById(R.id.add_item); 
    addButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onAddButtonClick(); 
     } 
    }); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
} 

private void onAddButtonClick() { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle(R.string.add_item); 

    final EditText input = new EditText(this); 
    input.setInputType(InputType.TYPE_CLASS_TEXT); 
    builder.setView(input); 

    builder.setPositiveButton(
      R.string.ok, 
      new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        ToDoItem item = new ToDoItem(
          input.getText().toString(), 
          false 
        ); 
        listManager.addItem(item); 
        adapter.swapItems(listManager.getList()); 
       } 
      }); 

    builder.setNegativeButton(
      R.string.cancel, 
      new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 

    builder.show(); 
} 

private class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { 


    private Context context; 
    private List<ToDoItem> items; 
    private LayoutInflater inflater; 

    public ToDoItemAdapter(
      Context context, 
      List<ToDoItem> items 
    ) { 
     super(context, -1, items); 

     this.context = context; 
     this.items = items; 
     this.inflater = LayoutInflater.from(context); 
    } 

    public void swapItems(List<ToDoItem> items) { 
     this.items = items; 
     notifyDataSetChanged(); 
    } 


    @Override 
    public int getCount() { 
     return items.size(); 
    } 



    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 



     final ItemViewHolder holder; 



     if(convertView == null) { 

      convertView = inflater.inflate(R.layout.to_do_item_layout, parent, false); 


      holder = new ItemViewHolder(); 
      holder.itemDescription = (TextView) convertView.findViewById(R.id.item); 
      holder.itemState = (CheckBox) convertView.findViewById(R.id.checkBox); 
      holder.itemTimeStamp = (TextView) convertView.findViewById(R.id.timeStamp); 
      holder.itemTimeStamp.setText(getPassedTimeForCreation(item.getTimeStamp())); 



      convertView.setTag(holder); 
     }else { 
      holder = (ItemViewHolder) convertView.getTag(); 
     } 


     holder.itemDescription.setText(items.get(position).getDescription()); 
     holder.itemState.setChecked(items.get(position).isComplete()); 


     holder.itemState.setTag(items.get(position)); 

     convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ToDoItem item = (ToDoItem) holder.itemState.getTag(); 
       item.toggleComplete(); 
       listManager.updateItem(item); 
       notifyDataSetChanged(); 
      } 
     }); 
     ImageButton deleteButton = (ImageButton) convertView.findViewById(R.id.delete_Button); 
     deleteButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       long itemId = items.get(position).getId(); 
       items.remove(items.get(position)); 
       listManager.deleteItem(itemId); 
       notifyDataSetChanged(); 
      } 
     }); 

     holder.itemState.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ToDoItem item = (ToDoItem) holder.itemState.getTag(); 
       item.toggleComplete(); 
       listManager.updateItem(item); 
       notifyDataSetChanged(); 

      } 
     }); 

     return convertView; 
    } 
} 


public static class ItemViewHolder{ 
    public TextView itemDescription; 
    public CheckBox itemState; 
} 
String getPassedTimeFromCreation(Long timeStamp){ 

    Calendar now = Calendar.getInstance(); 
    Long differece = now.getTimeInMillis() - timeStamp; 

    if (differece < (5 * 60 * 1000)) { // (5 minute in milliseconds) 
     return "5 min ago"; 
    } 
    else if(differece < (2 * 24 * 60 * 60 * 1000)){ // (2 days in millisecond) 
     return "2 days ago"; 
    }else{ 
     return "long time ago"; 
    } 
} 

} 

ToDoListManager.java

public class ToDoListManager { 
private DatabaseHelper dbHelper; 
public ToDoListManager(Context context) { 
    dbHelper = DatabaseHelper.getInstance(context); 
} 

public List<ToDoItem> getList() { 

    SQLiteDatabase db = dbHelper.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(
      "SELECT * FROM " + DatabaseHelper.ITEMS_TABLE, 
      null 
    ); 

    List<ToDoItem> items = new ArrayList<>(); 

    if(cursor.moveToFirst()) { 
     while(!cursor.isAfterLast()) { 

      ToDoItem item = new ToDoItem(
              cursor.getString(cursor.getColumnIndex("description")), 
      cursor.getInt(cursor.getColumnIndex("completed")) != 0, 
      cursor.getLong(cursor.getColumnIndex("_id")), 
      cursor.getLong(cursor.getColumnIndex("timeStamp")) 
      ); 
      items.add(item); 
      cursor.moveToNext(); 
     } 
    } 
    cursor.close(); 
    return items; 
} 

public void addItem(ToDoItem item) { 

    ContentValues newItem = new ContentValues(); 
    newItem.put("description", item.getDescription()); 
    newItem.put("completed", item.isComplete()); 
    newItem.put("timeStamp", item.getTimeStamp()); 

    SQLiteDatabase db = dbHelper.getWritableDatabase(); 
    db.insert(DatabaseHelper.ITEMS_TABLE, null, newItem); 


} 

public void updateItem(ToDoItem item) { 

    ContentValues editItem = new ContentValues(); 
    editItem.put("description", item.getDescription()); 
    editItem.put("completed", item.isComplete()); 
    newItem.put("timeStamp", item.getTimeStamp()); 


    SQLiteDatabase db = dbHelper.getWritableDatabase(); 

    String[] args = new String[] { String.valueOf(item.getId()) }; 

    db.update(DatabaseHelper.ITEMS_TABLE, editItem, "_id=?", args); 


} 
public void deleteItem(long itemId) { 

    SQLiteDatabase db = dbHelper.getWritableDatabase(); 
    db.delete(DatabaseHelper.ITEMS_TABLE, "_id = ?", 
      new String[] { String.valueOf(itemId) }); 
} 
} 

ToDoItem.java

import java.util.Calendar; 
public class ToDoItem { 
private long timeStamp; 
private String description; 
private boolean isComplete; 
private long id; 


public ToDoItem(String description, boolean isComplete, long id, long timeStamp) { 
    this.description = description; 
    this.isComplete = isComplete; 
    this.id = id; 
    this.timeStamp = timeStamp; 

} 

public ToDoItem(String description, boolean isComplete, long id) { 
    this.description = description; 
    this.isComplete = isComplete; 
    this.id = id; 
    Calendar now = Calendar.getInstance(); 
    this.timeStamp = now.getTimeInMillis(); 
} 



public String getDescription() { 
    return description; 
} 

public boolean isComplete() { 
    return isComplete; 
} 

public void toggleComplete() { 
    isComplete = !isComplete; 
} 
public long getId() {return id;} 

@Override 
public String toString() { 

    return getDescription(); 
} 

} 

MainActivity

Todo_list_manager

+0

У меня есть один вопрос первый, прежде чем ответить. вы просто хотите показать временную метку создания данных элемента или хотите показать время раздувания элемента в виде списка? вы хотите сохранить отметку времени в базе данных или нет? –

+0

это приложение todolist, поэтому каждый раз, когда они добавляют новое, чтобы сделать элемент, я хочу увидеть время, когда я его создал. (например, Добавлено 2 дня назад, Добавлено 5 минут назад). –

+0

, поэтому вам нужно добавить еще один столбец в базу данных для хранения пользовательского 'toDoItem'. и для показа времени в 'Добавлено 2 дня назад; Добавленный 5 минут назад' формат вам нужно написать функцию, которая сравнивает время создания элементов по текущему времени os и генерирует правильную строку –

ответ

0

Я думаю, что эта модификация поможет вам, я просто пишу основные части, вам нужно применить изменения самостоятельно. удачи!

DatabaseHelper.java

@Override 
public void onCreate(SQLiteDatabase db) { 

    String createQuery = "CREATE TABLE " + ITEMS_TABLE + " (" + 
      "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
      "description TEXT NOT NULL, " + 
      "completed INTEGER NOT NULL DEFAULT 0," + 
      "timeStamp INTEGER NOT NULL)"; 
    db.execSQL(createQuery); 
} 

ToDoItem.java

public class ToDoItem { 
    private Long timeStamp; 
    private String description; 
    private boolean isComplete; 
    private long id; 

    // I just added two getter and setter methods 
    public void setTimeStamp(Long timeStamp){ 
     this.timeStamp = timeStamp; 
    } 

    public Long getTimeStamp(){ 
     return timeStamp; 
    } 

    public ToDoItem(String description,boolean isComplete,long id, Long timeStamp) { 
     this.description = description; 
     this.isComplete = isComplete; 
     this.id = id; 
     this.timeStamp = timeStamp; 
    } 

    public ToDoItem(String description,boolean isComplete,long id) { 
     this.description = description; 
     this.isComplete = isComplete; 
     this.id = id; 
     Calendar now = Calendar.getInstance(); 
     this.timeStamp = now.getTimeInMillis(); 
    } 

} 

ToDoListManager.Java

public List<ToDoItem> getList() { 
    ... 
    ToDoItem item = new ToDoItem(
        cursor.getString(cursor.getColumnIndex("description")), 
        cursor.getInt(cursor.getColumnIndex("completed")) != 0, 
        cursor.getLong(cursor.getColumnIndex("_id")), 
        cursor.getLong(cursor.getColumnIndex("timeStamp")) 
      ); 
    ... 
} 

public void addItem(ToDoItem item) { 
    ... 
    // add this line 
    newItem.put("timeStamp", item.getTimeStamp()); 
    ... 
} 

public void updateItem(ToDoItem item) { 
    ... 
    // add this line 
    editItem.put("timeStamp", item.getTimeStamp()); 
    ... 
} 

ToDoItemAdapter класс

Я предполагаю, что вы добавляете TextView timeStamp к вашему to_do_item_layout и вашего ItemViewHolder класса

ItemViewHolder класса

public static class ItemViewHolder{ 
    public TextView itemDescription; 
    public CheckBox itemState; 
    public TextView itemTimeStamp; 
    } 
} 

GetView добавить строки

holder.itemTimeStamp = (TextView) convertView.findViewById(R.id.timeStamp); 
holder.itemTimeStamp.setText(getPassedTimeForCreation(item.getTimeStamp())); 

getPassedTimeForCreation (Long TIMESTAMP)

String getPassedTimeFromCreation(Long timeStamp){ 
     Calendar now = Calendar.getInstance(); 
     Long differece = now.getTimeInMillis() - timeStamp; 

     if (differece < (5 * 60 * 1000)) { // (5 minute in milliseconds) 
      return "5 min ago"; 
     } 
     else if(differece < (2 * 24 * 60 * 60 * 1000)){ // (2 days in millisecond) 
      return "2 days ago"; 
     }else{ 
      return "long time ago"; 
     } 
    } 

добавить функцию getPassedTimeForCreation в классе MainActivity, а не внутри тела функции MainActivity в !!!

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    `...` 
} 

@Override 
protected void onPause() { 
    `...` 
} 

private void onAddButtonClick() { 
    `...` 
} 

private class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { 
    `...` 
} 

public static class ItemViewHolder{ 
    `...` 
} 

/** 
* this is the place that you must put the function! 
*/ 
String getPassedTimeFromCreation(Long timeStamp){ 
    `...` 
} 
+0

Функция 'getPassedTimeForCreation' имеет низкую точность на данный момент, например, если элемент был создан 6 минут назад, это возвращает' 2 дня назад', если вам нужна более высокая точность, вам нужно проверить более 'if' условия –

+0

где я положить ** getPassedTimeForCreation (Long timeStamp) **? –

+0

Вы можете поместить функцию в 'MainActivity.java' –