2017-01-29 3 views
-1

Я думаю, что я нашел причину/или одну из причин, почему элемент из списка, который выбран, не удалит себя из базы данных. При создании строк базы данных каждый идентификатор get get и каждый раз, когда он равен ID + 1 для новой строки. Я расскажу о проблеме, используя пример:Выбор элемента из списка ListView (ListView показывает базу данных) и удаление его из списка и из базы данных

У меня есть 5 строк в моей базе данных (5 сотрудников), и каждый работодатель получает идентификатор автоматически, когда он добавляется в базу данных. Итак, у меня есть ID 1,2,3,4,5. Когда я удаляю первую строку (ID = 1), у меня есть 4 строки слева - 2,3,4,5, и они не «реорганизуют» себя на 1,2,3,4. Поэтому использование параметра «long id» из метода «onItemClick» не работает, так как я получаю ID = 0 для щелчка на первом занятии в списке, но ТОЛЬКО Впервые в моей базе данных нет ID = 0, но ID = 2 так как я удалил сотрудника с ID = 1 раньше. При нажатии на второе занятие в списке, я получаю ID = 1, а второй занятый в базе данных ID = 3.

Есть ли способ сделать базу данных всегда использовать идентификаторы от 1 до -n, то есть, если я удалю использование с ID = 1 из примера, есть ли способ сделать базу данных для изменения ID, так что это не 2,3,4,5 после удаления ID = 1, но 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; 
} 
+0

предоставьте xml вашего элемента списка – Malik

+0

Malik, я предоставил файл del_layout.xml, который я использую для отображения listview, его имя в моем сообщении как Second_layout – Mystiq

+0

ah, no. теперь я вижу ... вы используете android listViewItem. вам нужно создать собственный макет listViewItem, а затем вы можете использовать мой awnser – Malik

ответ

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

И ваш элемент должен исчезнуть.

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

Но чтобы все это работало, вы должны получить идентификатор сотрудника в БД , которую я предполагаю, что вы сделали/будет делать через ввод его в списке (можно скрыть скрыть TextView с android:visibility="gone")

Когда теперь пользователь нажимает на пункт ИО будет считывать и передавать в качестве аргумента функции deleteEmployee()

0

Я бы сделал это несколькими шагами.

  1. делает местный varible поле класса

    private List<Employe> employes; 
    

    в OnCreate метод:

    employes = db.selectAll(); 
    
  2. Реализовать Itemlistener

    public class RemoveEmploye extends Activity implements AdapterView.OnItemClickListener 
    

    в OnCreate метод :

    lv.setOnItemClickListener(this); 
    

    overide OnItemClick метод:

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    } 
    
  3. В методе onItemClick, удалить позицию Listposition в Employés, сохранить его в базе данных и обновить ListView

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> 

Краткое объяснение:
Наш delListAda PTER делает (пока) не более чем отображение списка, мы даем ему, когда мы называем

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

Это зачитает конкретный идентификатор сотрудника, чтобы удалить его/ее из базы данных, а также удалить запись из видимого списка ,

+0

@Mystiq. надеюсь это поможет... – Malik

0

Малик, ожидая ответа, я пробовал другим способом. Но когда я нажимаю кнопку «REMOVE», приложение падает.Если вы или кто-нибудь знаете причину сбоя, пожалуйста, сообщите. Вот как я пытался сделать это:

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 в качестве суперкласса. Как этого избежать?

Смежные вопросы