2016-04-19 1 views
0

Я получил некоторые данные из базы данных sqlite до пользовательских ListView. Теперь, когда я просматриваю данные в представлении списка, я хочу щелкнуть по строке, и появится окно с предупреждением о том, что вы хотите удалить эту строку? Если я нажимаю да, то конкретная строка должна быть удалена, пожалуйста, помогите мне в этой ситуации я отправляю мой код прямоУдаление строки из списка с использованием окна предупреждения в android

public class UserDbHelper extends SQLiteOpenHelper { 
    String[] projections = {}; 

    private static final String DATABASE_NAME = "userinfo.db"; 
    private static final Integer DATABASE_VERSION = 1; 
    private static final String CREAT_QUERY = 
      "CREATE TABLE "+ UserContracts.NewUserInfo.TABLE_NAME+"("+ UserContracts.NewUserInfo.USER_NAME+" TEXT,"+ 
        UserContracts.NewUserInfo.USER_MOB+" TEXT,"+ UserContracts.NewUserInfo.USER_EMAIL+" TEXT);"; 
    public UserDbHelper (Context context){  
    super(context,DATABASE_NAME,null,DATABASE_VERSION); 
     Log.e("DATABASE OPERATIONS","Database created/opened...");  
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     db.execSQL(CREAT_QUERY); 
     Log.e("DATABASE OPERATIONS", "Table created..."); 
    } 

    public void addInformation(String name,String mob,String email,SQLiteDatabase db) { 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(UserContracts.NewUserInfo.USER_NAME,name); 
     contentValues.put(UserContracts.NewUserInfo.USER_MOB,mob); 
     contentValues.put(UserContracts.NewUserInfo.USER_EMAIL,email); 
     db.insert(UserContracts.NewUserInfo.TABLE_NAME, null, contentValues); 
     Log.e("DATABASE OPERATIONS", "One row inserted"); 
    } 

    public Cursor getInformation(SQLiteDatabase db){ 
     Cursor cursor; 
     String[] projections = {UserContracts.NewUserInfo.USER_NAME, UserContracts.NewUserInfo.USER_MOB, 
       UserContracts.NewUserInfo.USER_EMAIL}; 
     cursor=db.query(UserContracts.NewUserInfo.TABLE_NAME,projections,null,null,null,null,null); 
     return cursor; 
    } 

    public void deleteInformation(String projections, SQLiteDatabase sqLiteDatabase) { 

     String selection = UserContracts.NewUserInfo.USER_NAME+"LIKE?"; 
     String[] selection_args = {projections}; 
     sqLiteDatabase.delete(UserContracts.NewUserInfo.TABLE_NAME,selection,selection_args); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 
} 

И ниже моя другая деятельность, в которой я написал окно предупреждения, но я не получаю требуемый результат здесь код

List list; 
ListView listView; 
SQLiteDatabase sqLiteDatabase; 
UserDbHelper userDbHelper; 
Cursor cursor; 
ListDataAdapter listDataAdapter; 
Context context; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.data_list_layout); 

    listView = (ListView)findViewById(R.id.list_view); 
    listDataAdapter = new ListDataAdapter(getApplicationContext(),R.layout.row_layout); 
    listView.setAdapter(listDataAdapter); 
    userDbHelper = new UserDbHelper(getApplicationContext()); 
    sqLiteDatabase = userDbHelper.getReadableDatabase(); 
    cursor = userDbHelper.getInformation(sqLiteDatabase); 
    if (cursor.moveToFirst()){ 

     do { 

      String name,mobile,email; 
      name = cursor.getString(0); 
      mobile = cursor.getString(1); 
      email = cursor.getString(2); 
      DataProvider dataProvider = new DataProvider(name,mobile,email); 
      listDataAdapter.add(dataProvider); 

     }while (cursor.moveToNext()); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> arg0, View view, final int position, long arg2) { 

       final AlertDialog.Builder builder = new AlertDialog.Builder(DataListActivity.this); 
       builder.setMessage("Do you want to delete this from database?"); 
       builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

        public void onClick(DialogInterface dialog, int whichButton) { 

         listDataAdapter.remove(listDataAdapter.getItem(0)); 
         Toast.makeText(getApplicationContext(), "Removed from list", Toast.LENGTH_SHORT).show(); 

        } 
       }); 
       builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         finish(); 
        } 
       }); 
       builder.show(); 
      } 
     }); 
    } 
} 

А вот мой список адаптер данных класса

public class ListDataAdapter extends ArrayAdapter { 
    List list = new ArrayList(); 
    public ListDataAdapter(Context context, int resource) { 
     super(context, resource);  
    } 

    static class LayoutHandler{  
     TextView NAME,MOBILE,EMAIL;  
    } 
    ListView listView; 

    @Override 
    public void add(Object object) { 
     super.add(object); 
     list.add(object); 
    }  

    @Override 
    public void remove(Object position) { 
     super.remove(position);  
    } 

    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return list.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) {  
     View row = convertView; 
     LayoutHandler layoutHandler; 
     if (row == null){ 

      LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = layoutInflater.inflate(R.layout.row_layout,parent,false); 
      layoutHandler = new LayoutHandler(); 
      layoutHandler.NAME = (TextView)row.findViewById(R.id.text_user_name); 
      layoutHandler.MOBILE = (TextView)row.findViewById(R.id.text_user_mobile); 
      layoutHandler.EMAIL = (TextView)row.findViewById(R.id.text_user_email); 
      row.setTag(layoutHandler); 
     } 
     else {  
      layoutHandler = (LayoutHandler)row.getTag();  
     } 

     DataProvider dataProvider = (DataProvider)this.getItem(position); 
     layoutHandler.NAME.setText(dataProvider.getName()); 
     layoutHandler.MOBILE.setText(dataProvider.getMobile()); 
     layoutHandler.EMAIL.setText(dataProvider.getEmail()); 

     return row;  
    } 
} 

Любая помощь будет высоко оценили спасибо :)

+0

В чем проблема? Не удаляется ли элемент из списка или элемент не удаляется из вашего списка? Если он не удаляется из вашего списка, попробовали ли вы 'listAdapter.notifyDataSetChanged();' после удаления элемента? –

+0

спасибо, его удаление, но я не пробовал listAdapter.notifyDataSetChanged(); вы не знаете, где я должен поставить этот код? спасибо –

+0

Ваш код должен выглядеть следующим образом внутри обработчика кнопки положительного номера 'listDataAdapter.remove (listDataAdapter.getItem (0));' ' listAdapter.notifyDataSetChanged();' ' Toast.makeText (getApplicationContext(), «Удалено из списка», Toast.LENGTH_SHORT) .show(); ' –

ответ

0

Вы можете получить идентификатор строки в диалоговом окне оповещения. Одним из решений будет затем написать метод удаления в вашем ListDataAdapter:

public class ListDataAdapter extends ArrayAdapter { 

    //Your existing code here 

    // Remove your element from list and inform Adapter that data set has changed 
    public boolean removeRow(int rowIndex){ 
    if(list.size() > rowIndex){ 
     list.remove(rowIndex); 
     notifyDataSetChanged(); 
     return true; 
    } 
    return false; 
    } 
} 

На месте вам нужно удалить строку, просто получить экземпляр адаптера и вызвать removeRow метод. Пример для удаления 3-е строки:

((ListDataAdapter)listView.getAdapter()).removeRow(2); 

Но будьте осторожны, notifyDataSetChanged() будет в основном перерисуйте ListView, поэтому, если это обычное действие, попробуйте использовать оптимизированную версию - RecyclerView. Сначала это выглядит немного сложнее, но обычно оно того стоит.

Вы можете найти некоторые хорошие учебники, как это одна: http://www.vogella.com/tutorials/AndroidRecyclerView/article.html

+0

Спасибо, дорогие вы, ребята, потрясающие, но я сделал, как вы сказали, но я не могу заставить его работать, потому что я упускаю что-то одно, как я могу получить его id? потому что у меня нет его идентификатора и, пожалуйста, скажите мне, где поставить код notifyDataSetChanged()? может быть, потому, что я не исправился? пожалуйста, поправьте меня и спасибо! –

+0

изменить эту строку listDataAdapter.remove (listDataAdapter.getItem (0)); : listDataAdapter.remove (position); в вашем OnItemClickListener – urgas9

+0

Спасибо, дорогой, я попробовал, он работает, но когда я закрываю приложение и открываю его снова, элементы все еще там, теперь я должен обновить строку, я думаю, чтобы избавиться от этой проблемы и поблагодарить вас Уважаемый –

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