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

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -