ListView 项目的删除选项总是删除第一个项目,无论单击哪个项目
Delete option for ListView items always deletes first item irrespective of which item is clicked
我是新手,我一直在尝试开发一个通讯录应用程序和另一个待办事项应用程序,但这是一个与我的通讯录应用程序相关的问题。
插入、查看和删除功能正常,但唯一的问题是无论我选择删除 ListView 上的什么项目,它总是删除最上面的项目。
这是一些代码:
主要活动:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView) findViewById(R.id.listView1);
im=(ImageButton) findViewById(R.id.add);
ii=(ImageButton) findViewById(R.id.image);
list = new ArrayList<HashMap<String,String>>();//memory allocation
list = db.getvalues();
ListAdapter ad= new SimpleAdapter(MainActivity.this, list, R.layout.custom, new String[]{"id","name"}, new int[]{R.id.id,R.id.name});
lv.setAdapter(ad);
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
TextView numtask = (TextView) arg1.findViewById(R.id.name);
phnum = numtask.getText().toString();
registerForContextMenu(lv);
return false;
}
});
ii.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i =new Intent(MainActivity.this,Main1Activity.class);
startActivity(i);
}
});
}
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Select The Action");
menu.add(0, v.getId(), 1, "DELETE");
}
public boolean onContextItemSelected(MenuItem item){
String number=phnum;
if(item.getTitle()=="DELETE"){
TextView id1=(TextView) findViewById(R.id.id);
db.deleterow(id1.getText().toString());
Toast.makeText(MainActivity.this,"Task Deleted!", Toast.LENGTH_SHORT).show();
list = new ArrayList<HashMap<String,String>>();//memory allocation
list = db.getvalues();
ListAdapter ad= new SimpleAdapter(MainActivity.this, list, R.layout.custom, new String[]{"id","name"}, new int[]{R.id.id,R.id.name});
lv.setAdapter(ad);
}else{
return false;
}
return true;
}
我不打算添加从 SQLiteOpenHelper class 扩展的 DBConnector class,因为它包含一些功能,因为正在填充数据库并正在删除项目,所以我不'认为这有问题。但是,如果您要我补充,如果您要我补充,我会这样做...
这是 custom.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
这是使用 DBconnector class 的 deleterow 方法:
public void deleterow(String numid) {
// TODO Auto-generated method stub
SQLiteDatabase sb = this.getWritableDatabase();
String sq = "DELETE FROM user WHERE id="+numid+";";
sb.execSQL(sq);
}
此外,我需要关于如何在 ListView 中不显示 ID 号和名称的建议。
请大家帮帮我!我指望你们所有人!
您正在 onContextItemSelected(MenuItem item)
方法中调用 TextView id1=(TextView) findViewById(R.id.id);
,因此它将 return 第一个项目的文本,因为您没有提供所选项目的 View
。
您的问题的解决方案是 AdapterContextMenuInfo
。当为此 AdapterView
调出上下文菜单时,它用于获取提供给 onCreateContextMenu(ContextMenu, View, ContextMenuInfo)
回调的额外菜单信息。
您可以获取所选项目的 View
,然后根据您的情况从 TextView
获取文本。
这里修改了onContextItemSelected(MenuItem item)
方法
public boolean onContextItemSelected(MenuItem item){
String number=phnum;
if(item.getTitle()=="DELETE"){
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
TextView id1=((TextView) info.targetView).findViewById(R.id.id);
db.deleterow(id1.getText().toString());
Toast.makeText(MainActivity.this,"Task Deleted!", Toast.LENGTH_SHORT).show();
list = new ArrayList<HashMap<String,String>>();//memory allocation
list = db.getvalues();
ListAdapter ad= new SimpleAdapter(MainActivity.this, list, R.layout.custom, new String[]{"id","name"}, new int[]{R.id.id,R.id.name});
lv.setAdapter(ad);
}else{
return false;
}
return true;
}
我是新手,我一直在尝试开发一个通讯录应用程序和另一个待办事项应用程序,但这是一个与我的通讯录应用程序相关的问题。
插入、查看和删除功能正常,但唯一的问题是无论我选择删除 ListView 上的什么项目,它总是删除最上面的项目。
这是一些代码:
主要活动:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView) findViewById(R.id.listView1);
im=(ImageButton) findViewById(R.id.add);
ii=(ImageButton) findViewById(R.id.image);
list = new ArrayList<HashMap<String,String>>();//memory allocation
list = db.getvalues();
ListAdapter ad= new SimpleAdapter(MainActivity.this, list, R.layout.custom, new String[]{"id","name"}, new int[]{R.id.id,R.id.name});
lv.setAdapter(ad);
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
TextView numtask = (TextView) arg1.findViewById(R.id.name);
phnum = numtask.getText().toString();
registerForContextMenu(lv);
return false;
}
});
ii.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i =new Intent(MainActivity.this,Main1Activity.class);
startActivity(i);
}
});
}
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Select The Action");
menu.add(0, v.getId(), 1, "DELETE");
}
public boolean onContextItemSelected(MenuItem item){
String number=phnum;
if(item.getTitle()=="DELETE"){
TextView id1=(TextView) findViewById(R.id.id);
db.deleterow(id1.getText().toString());
Toast.makeText(MainActivity.this,"Task Deleted!", Toast.LENGTH_SHORT).show();
list = new ArrayList<HashMap<String,String>>();//memory allocation
list = db.getvalues();
ListAdapter ad= new SimpleAdapter(MainActivity.this, list, R.layout.custom, new String[]{"id","name"}, new int[]{R.id.id,R.id.name});
lv.setAdapter(ad);
}else{
return false;
}
return true;
}
我不打算添加从 SQLiteOpenHelper class 扩展的 DBConnector class,因为它包含一些功能,因为正在填充数据库并正在删除项目,所以我不'认为这有问题。但是,如果您要我补充,如果您要我补充,我会这样做...
这是 custom.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
这是使用 DBconnector class 的 deleterow 方法:
public void deleterow(String numid) {
// TODO Auto-generated method stub
SQLiteDatabase sb = this.getWritableDatabase();
String sq = "DELETE FROM user WHERE id="+numid+";";
sb.execSQL(sq);
}
此外,我需要关于如何在 ListView 中不显示 ID 号和名称的建议。
请大家帮帮我!我指望你们所有人!
您正在 onContextItemSelected(MenuItem item)
方法中调用 TextView id1=(TextView) findViewById(R.id.id);
,因此它将 return 第一个项目的文本,因为您没有提供所选项目的 View
。
您的问题的解决方案是 AdapterContextMenuInfo
。当为此 AdapterView
调出上下文菜单时,它用于获取提供给 onCreateContextMenu(ContextMenu, View, ContextMenuInfo)
回调的额外菜单信息。
您可以获取所选项目的 View
,然后根据您的情况从 TextView
获取文本。
这里修改了onContextItemSelected(MenuItem item)
方法
public boolean onContextItemSelected(MenuItem item){
String number=phnum;
if(item.getTitle()=="DELETE"){
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
TextView id1=((TextView) info.targetView).findViewById(R.id.id);
db.deleterow(id1.getText().toString());
Toast.makeText(MainActivity.this,"Task Deleted!", Toast.LENGTH_SHORT).show();
list = new ArrayList<HashMap<String,String>>();//memory allocation
list = db.getvalues();
ListAdapter ad= new SimpleAdapter(MainActivity.this, list, R.layout.custom, new String[]{"id","name"}, new int[]{R.id.id,R.id.name});
lv.setAdapter(ad);
}else{
return false;
}
return true;
}