2015-10-19 2 views
1

Добрый день. Я хочу обновить ListView после удаления некоторых элементов из базы данных, но я вижу красные строки под remove (не может быть разрешен). У меня есть код ниже.ListView обновить после удаления некоторых предметов

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.listdisplay1); 
     dbHelper = new MyDatabaseHelper(this); 
     sqlcon = new InfoAPI(this); 
     final String name1 = getIntent().getExtras().getString("name"); 
     BuildList(name1); 

    } 

    public void BuildList(String name) { 
     final String name1 = name; 
     sqlcon.open(); 
     Cursor cursor=sqlcon.readEntry(name1); 

     String[] columns=new String[]{ 
       MyDatabaseHelper.Weather,MyDatabaseHelper.Date,MyDatabaseHelper.Status,MyDatabaseHelper.TimeIn_Info,MyDatabaseHelper.TimeOut_Info 
     }; 

     int[] to=new int[]{ 
       R.id.weather,R.id.date,R.id.status,R.id.in,R.id.out 
     }; 

     // create the adapter using the cursor pointing to the desired data 
     //as well as the layout information 
     dataAdapter = new SimpleCursorAdapter(
       this, R.layout.listdispaly, 
       cursor, 
       columns, 
       to, 
       0); 

     ListView listView = (ListView) findViewById(R.id.listView1); 
     // Assign adapter to ListView 
     listView.setAdapter(dataAdapter); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> listView, View view, 
            int position, long id) { 
       // Get the cursor, positioned to the corresponding row in the result set 
       Cursor cursor = (Cursor) listView.getItemAtPosition(position); 

       // Get the state's capital from this row in the database. 
       String ID = 
         cursor.getString(cursor.getColumnIndexOrThrow("_id")); 
       String date1 = cursor.getString(cursor.getColumnIndexOrThrow("Date")); 
       Intent intent = new Intent(ListDisplay.this, UpdatePage.class); 
       intent.putExtra("name1", name1); 
       intent.putExtra("date1", date1); 
       intent.putExtra("ID", ID); 
       startActivity(intent); 
      } 
     }); 

     listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      public boolean onItemLongClick(final AdapterView<?> p, View v, final int po, long id) { 
      // final long id1=id; 
       AlertDialog.Builder builder = new AlertDialog.Builder(ListDisplay.this); 
       builder.setTitle("Delete"); 
       builder.setMessage("Are you sure you want to delete?"); 
       builder.setIcon(android.R.drawable.ic_dialog_alert); 
       builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int ii) { 

         database = dbHelper.getWritableDatabase(); 
         Cursor cursor = (Cursor) p.getItemAtPosition(po); 

         // Get the state's capital from this row in the database. 
         long ID = 
           cursor.getLong(cursor.getColumnIndexOrThrow("_id")); 
         sqlcon.delete(ID); 
         p.remove(p.getItemAtPosition(po)); 
         dataAdapter.notifyDataSetChanged(); 



        } 
       }); 
       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 

         { 
          public void onClick(DialogInterface dialog, int ii) { 
           dialog.dismiss(); 
          } 
         } 

       ); 
       builder.show(); 
       return true; 
      } 
     }); 
    } 

      } 

Может кто-нибудь помочь мне разобраться с проблемой? Я новичок в андроид и не уверен, что это правильный способ реализации? Спасибо

Edited

Итак, я сделал то, что, как предложил @Sanju и теперь получаю эту ошибку

10-19 04:47:48.543 2094-2094/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.project.project, PID: 2094 
    java.lang.ClassCastException: android.app.Application cannot be cast to com.example.project.project.ListDisplay 
      at com.example.project.project.ListDisplay$2$1.onClick(ListDisplay.java:109) 
      at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:153) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 

Код отредактирован

database = dbHelper.getWritableDatabase(); 
         Cursor cursor = (Cursor) p.getItemAtPosition(po); 

         // Get the state's capital from this row in the database. 
         long ID = 
           cursor.getLong(cursor.getColumnIndexOrThrow("_id")); 
         sqlcon.delete(ID); 
         ((ListDisplay)getApplicationContext()).finish(); 
         Intent intent = new Intent(getApplicationContext(), ListDisplay.class); 
         getApplicationContext().startActivity(intent); 

        } 
       }); 

Любая идея?

Последние

final добавлен в columns, to и listView.

final String[] columns=new String[]{ 
      MyDatabaseHelper.Weather,MyDatabaseHelper.Date,MyDatabaseHelper.Status,MyDatabaseHelper.TimeIn_Info,MyDatabaseHelper.TimeOut_Info 
    }; 

    final int[] to=new int[]{ 
      R.id.weather,R.id.date,R.id.status,R.id.in,R.id.out 
    }; 

    // create the adapter using the cursor pointing to the desired data 
    //as well as the layout information 
    dataAdapter = new SimpleCursorAdapter(
      this, R.layout.listdispaly, 
      cursor, 
      columns, 
      to, 
      0); 

final ListView listView = (ListView) findViewById(R.id.listView1); 
    // Assign adapter to ListView 
    listView.setAdapter(dataAdapter); 

И сделал как этот

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      public boolean onItemLongClick(final AdapterView<?> p, View v, final int po, long id) { 
      // final long id1=id; 
       AlertDialog.Builder builder = new AlertDialog.Builder(ListDisplay.this); 
       builder.setTitle("Delete"); 
       builder.setMessage("Are you sure you want to delete?"); 
       builder.setIcon(android.R.drawable.ic_dialog_alert); 
       builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int ii) { 

         database = dbHelper.getWritableDatabase(); 
         Cursor cursor = (Cursor) p.getItemAtPosition(po); 

         // Get the state's capital from this row in the database. 
         long ID = 
           cursor.getLong(cursor.getColumnIndexOrThrow("_id")); 
         sqlcon.delete(ID); 

        } 
       }); 
       Cursor cursor=sqlcon.readEntry(name1); 
       dataAdapter = new SimpleCursorAdapter(
         getApplicationContext(), R.layout.listdispaly, 
         cursor, 
         columns, 
         to, 0); 
       //listView.setAdapter(null); 
       listView.setAdapter(dataAdapter); 

       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 

         { 
          public void onClick(DialogInterface dialog, int ii) { 
           dialog.dismiss(); 
          } 
         } 

       ); 
       builder.show(); 
       return true; 
      } 
     }); 

Все кажется отлично. Но когда я долгое время нажимаю строку и выворачивается AlertDialog, весь текст становится белым. Почему это произойдет?

+0

Решена ли ваша проблема? –

+0

@AnsalAli no ... – Hoo

+0

Любой может помочь? – Hoo

ответ

2

При этом (не компиляции) линии, вы пытаетесь манипулировать вид списка:

p.remove(p.getItemAtPosition(po)); 

Это не так, как это работает. Не пытайтесь напрямую манипулировать представлением. Идея использования адаптера для предоставления данных для представления заключается в том, что вы манипулируете данными, а не видом, а затем сигнализируете, что что-то изменилось. Трюк - это знать, как сигнализировать. Кажется, ваша следующая строка делает именно то, что:

dataAdapter.notifyDataSetChanged(); 

Так удалить первую строку (с p.remove), и это может сработать.

Если этого не достаточно (хотя я думаю, что это должно быть), то вам, возможно, придется поменять курсор в адаптере с новым, как это:

Cursor cursor2 = ... // create the same way you did when you created SimpleCursorAdapter 
dataAdapter.changeCursor(cursor2); 

В обновленной код:

builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int ii) { 

     database = dbHelper.getWritableDatabase(); 
     Cursor cursor = (Cursor) p.getItemAtPosition(po); 

     // Get the state's capital from this row in the database. 
     long ID = 
       cursor.getLong(cursor.getColumnIndexOrThrow("_id")); 
     sqlcon.delete(ID); 

     Cursor cursor2 = sqlcon.readEntry(name1); 
     dataAdapter.changeCursor(cursor2); 
    } 
}); 
+0

что должно быть внутри fetchAllRoutines? – Hoo

+0

Создайте его так же, как и при создании 'SimpleCursorAdapter'. (Обновлено мое сообщение) – janos

+0

создать после sqlcon.delete()? – Hoo

1

это то, что я сделал, чтобы удалить список строк попробовать что-то вроде этого в вашем адаптере классе

delet.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View view) { 
     cartdata.updateSelected(Integer.parseInt(cart_pdiscription[i]), 0); 
     cartdata.deleteProduct(Integer.parseInt(cart_pdiscription[i]));     
     Intent intent = ((CartList) context).getIntent(); 
     ((CartList) context).finish(); 
     context.startActivity(intent); 

    } 
}); 
+0

, где вы получаете CartList? – Hoo

+0

мое имя класса java – Android

+0

контекст не может быть разрешен, и я перехожу к getApplicationContext. Но все равно не повезло. – Hoo

1

Я вижу красные линии под удаления (не могут быть решены)

это происходит потому, что класс AdapterView не имеет метода, называемого remove. См. Также эти link и this.

сделать код для удаления строки выбранного Id, как в вашем редактировании,

 database = dbHelper.getWritableDatabase(); 
          Cursor cursor = (Cursor) p.getItemAtPosition(po); 

          // Get the state's capital from this row in the database. 
          long ID = 
            cursor.getLong(cursor.getColumnIndexOrThrow("_id")); 
          sqlcon.delete(ID);       

         } 
        }); 
and then try this snippet 

    cursor=sqlcon.readEntry(name1); 
      dataAdapter = new SimpleCursorAdapter(
        this, R.layout.listdispaly, 
        cursor, 
        columns, 
        to, 0); 
    //listView.setAdapter(null); 
    listView.setAdapter(dataAdapter); 

Но когда я долгое нажатие строки и AlertDialog выскочить весь текст станет белым .Why бы это произошло ?

Я не знаю, почему это происходит, но этот фрагмент может помочь вам избавиться от проблемы

builder.setInverseBackgroundForced(true); 
AlertDialog dialog = builder.create(); 
dialog.show(); 

Это заставит цвет фона инвертируется. Этот флаг используется только для материалов, предшествующих материалам. This method was deprecated in API level 23. This flag is only used for pre-Material themes. Instead, specify the window background using on the alert dialog theme.

+0

см. Мой отредактированный пост – Hoo

+0

проверить эту ссылку http://stackoverflow.com/questions/14482092/alertdialog-background-color –

+0

Отмечено, с благодарностью – Hoo

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