Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
329 views
in Technique[技术] by (71.8m points)

android - how to add a time stamp to a List View?

I want to add a timeStamp to the listView so it shows you when the item was created in this code. Is there any way, I can go about doing this. if some knows how to do this please let me know. 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)       {

 }

 }

The button works fine but it does not delete permently I don't know if it is the code or if it is where I am placing it in my MainActivity if someone would please tell that would much appreciated.

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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I think this modification helps you, I just write the main parts, you need to apply changes yourself. good luck!

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 class

I assume that you add a TextView timeStamp to your to_do_item_layout and your ItemViewHolder class

ItemViewHolder class

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

getView add this lines

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

add getPassedTimeForCreation function in MainActivity class, not inside of MainActivity's function body!!!

@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){
    `...`
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...