Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从ListView中选择项(ListView显示数据库)并将其从列表和数据库中删除_Android_Sqlite_Listview - Fatal编程技术网

Android 从ListView中选择项(ListView显示数据库)并将其从列表和数据库中删除

Android 从ListView中选择项(ListView显示数据库)并将其从列表和数据库中删除,android,sqlite,listview,Android,Sqlite,Listview,我想我找到了listview中选中的项无法从数据库中删除自身的原因/或其中一个原因。在创建数据库行时,每一行都会获取其ID,对于新行,每次都是ID+1。 我将使用以下示例说明问题: 我的数据库中有5行(5个雇员),每个雇员在添加到数据库时都会自动获得ID。我的ID是1,2,3,4,5。当我删除第一行(ID=1)时,剩下4行-2,3,4,5,它们不会将自己“重构”为1,2,3,4。所以,使用“onItemClick”方法中的“long id”参数不起作用,因为我在单击列表中的第一个雇员时得到id=

我想我找到了listview中选中的项无法从数据库中删除自身的原因/或其中一个原因。在创建数据库行时,每一行都会获取其ID,对于新行,每次都是ID+1。 我将使用以下示例说明问题:

我的数据库中有5行(5个雇员),每个雇员在添加到数据库时都会自动获得ID。我的ID是1,2,3,4,5。当我删除第一行(ID=1)时,剩下4行-2,3,4,5,它们不会将自己“重构”为1,2,3,4。所以,使用“onItemClick”方法中的“long id”参数不起作用,因为我在单击列表中的第一个雇员时得到id=0,但我数据库中的同一个第一个雇员没有id=0,但id=2,因为我之前删除了id=1的雇员。单击列表中的第二个雇员,我得到ID=1,数据库中的第二个雇员的ID=3

是否有任何方法使数据库始终使用从1到-n个雇员的ID,这意味着如果我从示例中删除ID=1的雇员,是否有任何方法使数据库更改ID,所以在删除ID=1后不是2,3,4,5,而是1,2,3,4?? 我检查了与我的问题类似的所有其他问题和答案,但没有一个对我有效。 在MainActivity中,当单击按钮时,它将切换到第二个活动和第二个布局。在第二个活动中,我使用适配器显示数据库列表。我的列表在那里,但我不能单击任何项目并将其删除。我尝试了侦听器、listActivity等,但没有任何效果。我还在学习,请耐心等待

我想要的是在布局中显示此列表,当用户单击其中一个项目时,系统会询问他是否要删除,如果他选择“是”,则所选项目将从listview和数据库中删除

我的第二项活动是:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.List;

public class RemoveEmploye extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.del_layout);
        final Database db=new Database(this);
        final ListView lv =    (ListView)findViewById(R.id.delEmployeList);
        List<Employe> employes = db.selectAll();
        ArrayAdapter<Employe> adapter = new ArrayAdapter<>
(this,android.R.layout.simple_list_item_1, android.R.id.text1, employes);
        lv.setAdapter(adapter);
    }

    public void goBack(View v) {
        Intent in= new Intent(RemoveEmploye.this,MainActivity.class);
        startActivity(in);
    }
导入android.app.Activity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入java.util.List;
公共类RemoveEmploye扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.del_布局);
最终数据库db=新数据库(此数据库);
最终ListView lv=(ListView)findViewById(R.id.delEmployeList);
List employes=db.selectAll();
ArrayAdapter适配器=新的ArrayAdapter
(这是android.R.layout.simple_list_item_1,android.R.id.text1,employes);
低压设置适配器(适配器);
}
公共作废戈巴克(视图五){
Intent in=新的Intent(RemoveEmploye.this,MainActivity.class);
星触觉(in);
}
我的第二个布局是(del_layout.xml):


我的数据库selectAll()是:

public List selectAll(){
SQLiteDatabase db=this.getReadableDatabase();
Cursor Cursor=db.query(“EmployeDB”,新字符串[]{ID,姓名,姓氏,年龄,
COMPANY,WTYPE},null,新字符串[]{},null,null,null,null,null);
字符串名称=”;
字符串姓氏=”;
字符串年龄=”;
字符串公司=”;
字符串wtype=“”;
int id=0;
ArrayList employes=新的ArrayList();
if(cursor.moveToFirst()){
做{
id=Integer.parseInt(cursor.getString(0));
name=cursor.getString(1);
姓氏=cursor.getString(2);
age=cursor.getString(3);
company=cursor.getString(4);
wtype=cursor.getString(5);
雇员=新雇员();
e、 setId(id);
e、 集合名(名称);
e、 setSurname(姓氏);
e、 setAge(Integer.parseInt(age));
e、 公司(公司),;
e、 setWorktype(wtype);
增加(e);
}while(cursor.moveToNext());
}
返回雇员;
}

要选择该列表的条目,您必须添加一个如下所示的监听器:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        TextView employeeID = (TextView) view.findViewById(R.id.employeeID);
        deleteEmployee(Integer.parseInt(employeeID.getText().toString()));

        adapter.remove(position);
        adapter.notifyDataSetChanged();
    }
});
public void deleteEmployee(Integer id) {
    SQLiteDatabase db = this.getReadableDatabase();
    db.execSQL("DELETE FROM EmployeDB WHERE id = " + id.toString());
    db.close();
}
但要使所有这些都起作用,您必须在DB中获取员工的id 我假设您通过将文本视图放入列表中(您可以使用
android:visibility=“gone”
隐藏文本视图)做到了/将要做到这一点


当用户现在单击某个项目时,该id将被读取并作为参数传递给
deleteMemployee()
函数

您应该将setOnItemClickListener应用于ListView

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        }
    }); 

您的元素应该消失。

我将分几个步骤来完成

  • 使局部变量成为类的字段

    private List<Employe> employes;
    
  • 实现一个Itemlistener

    public class RemoveEmploye extends Activity implements AdapterView.OnItemClickListener
    
    在onCreate方法中:

    employes = db.selectAll();
    
    lv.setOnItemClickListener(this);
    
    覆盖法:

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    }
    
    @覆盖
    public void onItemClick(AdapterView父对象、视图、整型位置、长id){
    }
    
  • 在onItemClick方法中,删除employes中的Listposition,将其保存在数据库中并刷新listview

  • 所以

    首先,我们必须使用
    自定义列表视图适配器

    快速解释:
    我们的delListAdapter(目前)没有更多功能 而不是绘制一个列表,我们给他打电话的时候

    我们将列表中的单个元素映射到可见的列表项上

    现在我们可以设置OnClickLister

    lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
    @凌驾
    public void onItemClick(AdapterView父对象、视图、整型位置、长id){
    TextView employeeID=(TextView)view.findViewById(R.id.employeeID);
    //TODO:使函数从数据库中删除
    移除(位置);
    parent.notifyDataSetChanged();
    }
    });
    

    这将读取员工的特定id以从数据库中删除他/她,还将从可见列表中删除该条目。

    Malik,在等待您的回答时,我尝试了其他方法。但当我单击“删除”按钮时,应用程序崩溃。如果您或任何人知道崩溃的原因,请告诉我。 以下是我尝试的方法:

    public class RemoveEmploye extends Activity {
    ListView lv;
    int i;
    Database db;
    ArrayAdapter<Employe> adapter;
    Employe e;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.row_view);
    db = new Database(this);
    lv = (ListView) findViewById(R.id.list);
    List<Employe> employes = db.selectAll();
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,
    android.R.id.text1, employes);
    lv.setAdapter(adapter);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long
    id) {
    e = (Employe) lv.getItemAtPosition(position);
    i = e.getId();
    System.out.println(i);
    }
    });
    }
    public void onDeleteClick() {
    db.deleteEmployee(i);
    adapter.remove(e);
    adapter.notifyDataSetChanged();
    Intent in = new Intent(RemoveEmploye.this,RemoveEmploye.class);
    startActivity(in);
    }
    
    公共类RemoveEmploye扩展活动{
    ListView lv;
    int
    
    lv.setOnItemClickListener(this);
    
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    }
    
    class delListAdapter extends ArrayAdapter<Employe> {
    
        private List<Employe> list;
    
        delListAdapter(List<Employe> list) {
            super(getActivity(), R.layout.delListItem, delEmployeList);
            this.list = list;
        }
    
        @Override
        public View getView(int pos, View view, ViewGroup parent) {
            if (view == null) {
                view = getActivity().getLayoutInflater().inflate(R.layout.delListItem, parent, false);
            }
    
            Employe current = list.get(pos);
    
            TextView title = (TextView) view.findViewById(R.id.employeeName);
            title.setText(current.getName() + ", " + current.getSurname());
    
            TextView id = (TextView) view.findViewById(R.id.seriesId);
            id.setText(current.getId().toString());
    
            return view;
        }
    
        @Override
        public int getCount() {
            return list != null ? list.size() : 0;
        }
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="vertical"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:padding="10dp">
    
        <TextView
            android:id="@+id/employeeName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Name, Surname"/>
    
        <TextView
            android:id="@+id/employeeId"
            android:visibility="gone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    
    </LinearLayout>
    
        ArrayAdapter<Employe> adapter = new delListAdapter(employes);
        lv.setAdapter(adapter);
    
        TextView title = (TextView) view.findViewById(R.id.employeeName);
        title.setText(current.getName() + ", " + current.getSurname());
    
        TextView id = (TextView) view.findViewById(R.id.employeeId);
        id.setText(current.getId().toString());
    
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            TextView employeeID = (TextView) view.findViewById(R.id.employeeID);
            //TODO: make function to delete from DB
    
            parent.remove(position);
            parent.notifyDataSetChanged();
        }
    });
    
    public class RemoveEmploye extends Activity {
    ListView lv;
    int i;
    Database db;
    ArrayAdapter<Employe> adapter;
    Employe e;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.row_view);
    db = new Database(this);
    lv = (ListView) findViewById(R.id.list);
    List<Employe> employes = db.selectAll();
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,
    android.R.id.text1, employes);
    lv.setAdapter(adapter);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long
    id) {
    e = (Employe) lv.getItemAtPosition(position);
    i = e.getId();
    System.out.println(i);
    }
    });
    }
    public void onDeleteClick() {
    db.deleteEmployee(i);
    adapter.remove(e);
    adapter.notifyDataSetChanged();
    Intent in = new Intent(RemoveEmploye.this,RemoveEmploye.class);
    startActivity(in);
    }