xml - Creating a contextual menu when long pressing item in android -
i creating checklist , allows user add new items list, trying allow user delete item when want to. creating contextual menu using this comes when user long-presses item in list. right now, recognizes long-press nothing happens, contextual menu doesn't appear.
here activity page: (viewtask.java)
package com.example.androidhive; import java.util.arraylist; import java.util.list; import android.os.bundle; import android.app.activity; import android.content.context; import android.database.sqlite.sqlitedatabase; import android.util.log; import android.view.contextmenu; import android.view.contextmenu.contextmenuinfo; import android.view.layoutinflater; import android.view.menu; import android.view.menuinflater; import android.view.menuitem; import android.view.view; import android.view.viewgroup; import android.widget.adapterview.adaptercontextmenuinfo; import android.widget.arrayadapter; import android.widget.checkbox; import android.widget.edittext; import android.widget.listview; import android.widget.textview; import android.widget.toast; public class viewtask extends activity { protected taskerdbhelper db; list<task> list; myadapter adapt; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_view_task); db = new taskerdbhelper(this); list = db.getalltasks(); adapt = new myadapter(this, r.layout.list_inner_view, list); listview listtask = (listview) findviewbyid(r.id.listview1); listtask.setadapter(adapt); } public void addtasknow(view v) { edittext t = (edittext) findviewbyid(r.id.edittext1); string s = t.gettext().tostring(); if (s.equalsignorecase("")) { toast.maketext(this, "enter goal please!", toast.length_long); } else { task task = new task(s, 0); db.addtask(task); log.d("tasker", "data added"); t.settext(""); adapt.add(task); adapt.notifydatasetchanged(); } } @override public void oncreatecontextmenu(contextmenu menu, view v, contextmenuinfo menuinfo) { super.oncreatecontextmenu(menu, v, menuinfo); menuinflater inflater = getmenuinflater(); inflater.inflate(r.layout.cmenu, menu); } @override public boolean oncontextitemselected(menuitem item) { adaptercontextmenuinfo info = (adaptercontextmenuinfo) item.getmenuinfo(); switch (item.getitemid()) { case r.id.delete_task: db.deletetask(info.id); return true; default: return super.oncontextitemselected(item); } } @override public boolean oncreateoptionsmenu(menu menu) { // inflate menu; adds items action bar if present. getmenuinflater().inflate(r.layout.activity_view_task, menu); return true; } private class myadapter extends arrayadapter<task> { context context; list<task> tasklist = new arraylist<task>(); int layoutresourceid; public myadapter(context context, int layoutresourceid, list<task> objects) { super(context, layoutresourceid, objects); this.layoutresourceid = layoutresourceid; this.tasklist = objects; this.context = context; } /** * method define view inside list view * here going code checkbox state * status of task , check box text task name */ @override public view getview(int position, view convertview, viewgroup parent) { checkbox chk = null; if (convertview == null) { layoutinflater inflater = (layoutinflater) context .getsystemservice(context.layout_inflater_service); convertview = inflater.inflate(r.layout.list_inner_view, parent, false); chk = (checkbox) convertview.findviewbyid(r.id.chkstatus); convertview.settag(chk); chk.setonclicklistener(new view.onclicklistener() { public void onclick(view v) { checkbox cb = (checkbox) v; task changetask = (task) cb.gettag(); changetask.setstatus(cb.ischecked() == true ? 1 : 0); db.updatetask(changetask); if(cb.ischecked()) { toast.maketext( getapplicationcontext(), "goal accomplished!", toast.length_long).show(); } } }); } else { chk = (checkbox) convertview.gettag(); } task current = tasklist.get(position); chk.settext(current.gettaskname()); chk.setchecked(current.getstatus() == 1 ? true : false); chk.settag(current); log.d("listener", string.valueof(current.getid())); return convertview; } } }
here xml page associated page:(activity_view_task.xml)
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#de8126" android:orientation="vertical" > <!-- header start --> <linearlayout android:id="@+id/header" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@layout/header_gradient" android:orientation="vertical" android:paddingbottom="5dip" android:paddingtop="5dip" > <!-- logo start --> <imageview android:id="@+id/logobutton" android:layout_width="match_parent" android:layout_height="132dp" android:src="@drawable/logo" /> <!-- logo ends --> </linearlayout> <!-- header end --> <!-- goals title start --> <linearlayout android:id="@+id/goalstitle" android:layout_width="match_parent" android:layout_height="80dp" android:paddingtop="5dip" android:paddingbottom="5dip"> <textview android:id="@+id/gtitle" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="my goals" android:textsize="50sp" android:textscalex="1.5" android:textstyle="bold" android:gravity="center"/> </linearlayout> <!-- goals title end --> <relativelayout 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" tools:context=".viewtask" > <edittext android:id="@+id/edittext1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparenttop="true" android:ems="10" > <requestfocus /> </edittext> <button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentright="true" android:layout_alignparenttop="true" android:layout_marginright="14dp" android:text="@string/save" android:onclick="addtasknow"/> <listview android:id="@+id/listview1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_below="@+id/button1" > </listview> </relativelayout> </linearlayout>
and here menu itself: (cmenu.xml)
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/edit_task"></item> <item android:id="@+id/delete_task"></item> </menu>
thanks responses, cannot item deleted.
here database helper page:(taskerdbhelper.java)
package com.example.androidhive; import java.util.arraylist; import java.util.list; import android.content.contentvalues; import android.content.context; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqlitedatabase.cursorfactory; import android.database.sqlite.sqliteopenhelper; public class taskerdbhelper extends sqliteopenhelper{ private static final int database_version = 1; // database name private static final string database_name = "taskermanager"; // tasks table name private static final string table_tasks = "tasks"; // tasks table columns names private static final string key_id = "id"; private static final string key_taskname = "taskname"; private static final string key_status = "status"; public taskerdbhelper(context context) { super(context, database_name, null, database_version); } @override public void oncreate(sqlitedatabase db) { string sql = "create table if not exists " + table_tasks + " ( " + key_id + " integer primary key autoincrement, " + key_taskname+ " text, " + key_status + " integer)"; db.execsql(sql); } @override public void onupgrade(sqlitedatabase db, int oldv, int newv) { // drop older table if existed db.execsql("drop table if exists " + table_tasks); // create tables again oncreate(db); } public void addtask(task task) { sqlitedatabase db = this.getwritabledatabase(); contentvalues values = new contentvalues(); values.put(key_taskname, task.gettaskname()); // task name // status of task- can 0 not done , 1 done values.put(key_status, task.getstatus()); // inserting row db.insert(table_tasks, null, values); db.close(); // closing database connection } public boolean deletetask(long task) { sqlitedatabase db = this.getwritabledatabase(); return db.delete(table_tasks, key_taskname + "=" + task, null) > 0; } public list<task> getalltasks() { list<task> tasklist = new arraylist<task>(); // select query string selectquery = "select * " + table_tasks; sqlitedatabase db = this.getwritabledatabase(); cursor cursor = db.rawquery(selectquery, null); // looping through rows , adding list if (cursor.movetofirst()) { { task task = new task(); task.setid(cursor.getint(0)); task.settaskname(cursor.getstring(1)); task.setstatus(cursor.getint(2)); // adding contact list tasklist.add(task); } while (cursor.movetonext()); } // return task list return tasklist; } public void updatetask(task task) { // updating row sqlitedatabase db = this.getwritabledatabase(); contentvalues values = new contentvalues(); values.put(key_taskname, task.gettaskname()); values.put(key_status, task.getstatus()); db.update(table_tasks, values, key_id + " = ?",new string[] {string.valueof(task.getid())}); db.close(); } }
that file above contains deletetask().
i don't see registerforcontextmenu() anywhere. necessary list know has contextmenu.
protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_view_task); db = new taskerdbhelper(this); list = db.getalltasks(); adapt = new myadapter(this, r.layout.list_inner_view, list); listview listtask = (listview) findviewbyid(r.id.listview1); listtask.setadapter(adapt); registerforcontextmenu(listtask); // <-- register! }
in addition should put string value in menu xml file. better refer string xml file actual string.
<item android:id="@+id/edit_task" android:title="edit"> </item> <item android:id="@+id/delete_task" android:title="delete"> </item>
concerning delete task: delete task sql database need kind of identifier. far can tell, have task name , status integer. if allow tasks have same name, cannot used unique identifier. perhaps should add task class. can use find , remove specific task in database. (your info.id not work, because merely identifier of view) can use info.position retrieve position of task in tasklist, or more specifically, current list in adapter.
case r.id.delete_task: task task = list.get(info.position); if (db.deletetask(task.getuniqueidentifier())) { // <-- determine unique id list.remove(info.position); listtask.invalidate(); return true; } return false;
i'm not sure whether invalidate() trick. give try. give adapter new list , call notifydatasetchanged() addtasknow().
Comments
Post a Comment