2014-04-04 5 views
-1

Этот фрагмент кода написан, чтобы пользователь мог ввести имя заведения для поиска. Как только имя будет найдено, оно будет отображаться. Если кнопка поиска нажата без какого-либо указания для поиска, все записи будут отображаться.
Когда элемент выбран в виде списка, я хотел бы удалить этот элемент. Несмотря на то, что элемент удаляется, как только список будет повторно сгенерирован при открытии поиска, он все еще появляется.
Как это можно исправить?Удалить элемент в виде списка

 package com.example.farejudgeapp; 

     import java.util.ArrayList; 
     import java.util.List; 
     import android.app.AlertDialog; 
     import android.content.DialogInterface; 
     import android.database.Cursor; 
     import android.database.sqlite.SQLiteDatabase; 
     import android.os.Bundle; 
     import android.view.View; 
     import android.widget.AdapterView; 
     import android.widget.AdapterView.OnItemClickListener; 
     import android.widget.EditText; 
     import android.widget.ListView; 

     public class ListEstablishmentsActivity extends Base_Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list_establishments); 
    }//closes onCreate method 


    //reading data from database 
    public void getEstablishmentMatches(View view){ 


     EstablishmentHelper helper = new EstablishmentHelper(this); 
     final SQLiteDatabase db = helper.getReadableDatabase(); 

     //These are the rows from the Establishment's database that would be retrieved 
     String columns1 [] = {"establishmentName", "establishmentType", "foodServed", "location", "contactNumber"}; 


     final ListView listview = (ListView)findViewById(R.id.searchEstablishmentsListView); 
     final List<String> establishments = new ArrayList<String>(); 
     String selection = "establishmentName LIKE ?"; 


     //Capture data entered in text box 
     EditText establishmentSearchText = (EditText)findViewById(R.id.editTextSearchEstablishment); 
     String establishmentSearchTextString = establishmentSearchText.getText().toString(); 

     //Searching for establishment 
     String selectionArgs [] = {"%" + establishmentSearchTextString + "%"}; 

     //Querying database 
     Cursor c = db.query("establishments", columns1, selection, selectionArgs, null, null, null); 

     //Loops to add data from database to the list view 
     c.moveToFirst(); 
     while(!c.isAfterLast()) 
     { 

      final String establishmentName = c.getString(c.getColumnIndex("establishmentName")); 
      final String establishmentType = c.getString(c.getColumnIndex("establishmentType")); 
      final String foodServed = c.getString(c.getColumnIndex("foodServed")); 
      final String location = c.getString(c.getColumnIndex("location")); 
      final String contactNumber = c.getString(c.getColumnIndex("contactNumber")); 
      final String details = "Establishment Name: " + establishmentName + "\n" + "Establishment Type: " + establishmentType + "\n" + "Food Served: " + foodServed + "\n" + "Location: " + location + "\n" + "Contact Number: " + contactNumber ; 
      //Show various column data//    
      establishments.add(details); 

      c.moveToNext(); 
     }//close while loop 




      //Create an empty adapter that would be used to display the loaded data. 
      final EstablishmentAdapter adapter = new EstablishmentAdapter(this, android.R.layout.simple_list_item_1, establishments); 
      listview.setAdapter(adapter); 

      //Listens for when an item is clicked. 
      listview.setOnItemClickListener(new OnItemClickListener() { 


       //Prompts user to delete an establishment when an item is clicked. 
       @Override 
        public void onItemClick(AdapterView<?> parent, final View view, 
        final int position, final long id) { 
        // Create and display the Alert dialog when next is clicked 



        new AlertDialog.Builder(ListEstablishmentsActivity.this) 
          .setTitle(" Delete Establishment ") 
          .setMessage( 
            "Are you sure you want to delete the selected establishment?") 
          .setNeutralButton("No", 
            new DialogInterface.OnClickListener() { 

             public void onClick(DialogInterface Dialog, 
               int which) { 
              // do nothing - it will just close when clicked 
             }//closes onClick method 
            }) 
          .setPositiveButton("Yes", 
            new DialogInterface.OnClickListener() { 



             //Deletes selected establishment 
             @Override 
             public void onClick(DialogInterface Dialog, int which) { 
              /* 
              * http://androidforbegineers.blogspot.com/2013/08/delete-row-item-in-listview-android.html 
              */ 
              //Deletes selected establishment from database 

              //Captures id of the list view item that was selected to be deleted 
              final long deleteId = id; 
              db.execSQL("DELETE FROM establishments WHERE id=" + deleteId); 
              //db.delete("establishments", "id="+deleteId, null); 

              establishments.remove(deleteId); 
              //establishments.remove(position); 


              android.util.Log.w(this.getClass().getName(), 
                " Establishment Deleted"); 


              //Removes item from list view 
              establishments.remove(position); 
              adapter.notifyDataSetChanged(); 
              adapter.notifyDataSetInvalidated(); 

             }//closes onClick Method 

            }).show(); 

         }//Closes onItemClick method 

      });//Closes setOnItemClickListener 


    }//closes getEstablishmentMatches method 

}//closes ListEstablishmentsActivity class 
+0

Вы пробовали с помощью 'adapter.remove (пункт)'? – nKn

ответ

2

Вы удаляете элемент из ArrayList только и не переходник, который до сих пор держит все элементы ..

//Removes item from list view 
establishments.remove(position); 

Но, вы должны удалить его из адаптера также -

adapter.remove(item); 
adapter.notifyDataSetChanged(); 
adapter.notifyDataSetInvalidated(); 
+0

Я пробовал это, но он все еще не работает – user3498995

0

удаляет номер элемента i из списка, я имею в виду 0 = первый, 1 = второй и т. Д.

Для удаления в базе данных по идентификатору это хорошо, но, чтобы удалить из списка попробовать

establishments.remove(position); 
+0

В чем ваш ответ @ kanak-sony? Это подмножество информации о ней ... – nKn

+0

Потому что она сказала, что он удаляется по положению, но на самом деле исходный код комментируется, я указываю, что единственной проблемой является использование позиции, а не идентификатора для списков. И ... не обязательно вызывать adapter.remove, если ссылка на список одинаковая (что в этом случае) –

+0

Есть ли способ получить доступ к строкам в цикле while при выборе элемента? – user3498995

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