从ListView中选择项目(ListView显示数据库)并从列表和数据库

时间:2017-01-29 15:42:29

标签: android sqlite 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,所以它不是2删除ID = 1后3,4,5,但1,2,3,4再次??

我检查所有其他问题和答案类似于我的问题,但它都不适用于我。 在MainActivity中单击按钮时,它会切换到第二个活动和第二个布局。在第二个活动中,我使用适配器来显示数据库列表。我的列表在那里,但我无法点击任何项目并将其删除。我试过听众,listActivity等,但没有任何作用。我还在学习,请耐心等待。

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

我的第二项活动是:

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

我的第二个布局是(del_layout.xml):

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.EmDatabase.RemoveEmploye">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="527dp"
        android:id="@+id/delEmployeList">
    </ListView>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/back"
        android:clickable="true"
        android:onClick="goBack"/>

</LinearLayout>

我的数据库selectAll()是:

public List<Employe> selectAll() {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query("EmployeDB", new String[] { ID, NAME, SURNAME, AGE,
COMPANY, WTYPE}, null, new String[] { }, null, null, null, null);
    String name="";
    String surname="";
    String age="";
    String company="";
    String wtype="";
    int id=0;
    ArrayList<Employe> employes =new ArrayList<Employe>();

    if(cursor.moveToFirst()) {
        do {
            id= Integer.parseInt(cursor.getString(0));
            name= cursor.getString(1);
            surname= cursor.getString(2);
            age= cursor.getString(3);
            company= cursor.getString(4);
            wtype= cursor.getString(5);
            Employe e= new Employe();
            e.setId(id);
            e.setName(name);
            e.setSurname(surname);
            e.setAge(Integer.parseInt(age));
            e.setCompany(company);
            e.setWorktype(wtype);
            employes.add(e);
        } while (cursor.moveToNext());
    }
    return employes;
}

5 个答案:

答案 0 :(得分:0)

要选择该列表的条目,您必须添加如下的OnItemClickListener:

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();
    }
});

之后,您可以像这样进行SQL查询:

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"隐藏隐藏文本视图)

当用户现在点击一个Item时,id将被读出并作为参数传递给deleteEmployee()函数

答案 1 :(得分:0)

您应该将setOnItemClickListener应用于ListView

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

        }
    }); 

在里面你可以用元素做任何你想做的事。如果要删除它,可以执行以下操作:

adapter.remove(position);
adapter.notifyDataSetChanged();

你的元素应该消失。

答案 2 :(得分:0)

我会分几步完成。

  1. 使本地变量成为类

    的字段
    Sub SaveAsPDF()
    
    Dim path As String
    Dim MyDate As String
    Dim WS As Worksheet
    path = "c:\invoice\"
    
    MyDate = Date
    MyDate = Format(MyDate, "dd_mm_yyyy")
    
    Application.DisplayAlerts = False
    
    For Each WS In ThisWorkbook.Worksheets
        WS.ExportAsFixedFormat Filename:=path & Range("D6").Text & "-" & Range("K6").Value & "-" & MyDate, Type:=xlTypePDF
    Next
    
    Application.DisplayAlerts = True
    
    ActiveWorkbook.Close savechanges:=False
    
    End Sub
    
    onCreate方法中的

    private List<Employe> employes;
    
  2. 实现Itemlistener

    employes = db.selectAll();
    
    onCreate方法中的

    public class RemoveEmploye extends Activity implements AdapterView.OnItemClickListener
    

    覆盖OnItemClick方法:

    lv.setOnItemClickListener(this);
    
  3. 在onItemClick方法中,删除雇员中的Listposition位置,将其保存在数据库中并刷新listview

答案 3 :(得分:0)

所以

  

首先我们必须使用custom list view adapter ...

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

...和custom list view item

<?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>
  

快速解释:我们的delListAdapter(暂时没有)   而不是映射列表,我们打电话给他时

    ArrayAdapter<Employe> adapter = new delListAdapter(employes);
    lv.setAdapter(adapter);

在我们的onCreate函数中,我们提供给他的布局。

使用这些行:

    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());

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

  

现在我们可以设置OnClickLister

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();
    }
});

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

答案 4 :(得分:0)

马利克,在等待你的回答时我尝试了其他方式。但是,当我点击按钮删除应用程序崩溃。如果您或任何人知道崩溃的原因,请告诉我们。 这是我尝试这样做的方式:

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

我也试过你的代码,但是在创建类delListAdapter时扩展了ArrayAdapter,当我将ArrayAdapter作为超类编写时,我在创建窗口时出错。如何避免?