2012-02-19 172 views
2

因爲糟糕的編程風格和Android經驗不足,我感到非常沮喪。很抱歉告訴你們。數據庫更改後ListView未更新

應用程序是如何工作的:

這是我的工作訓練待辦事項應用程序。有6列。 其中3個包含關於待辦事項的信息,其他3個包含查看詳細信息,編輯和刪除屏幕。

當用戶由於某種原因點擊刪除後,即使設置了notifyDataChange後,我的屏幕也不會更新,並且仍然顯示刪除的行。

有什麼想法在這裏發生了什麼?我已經嘗試了許多解決方案,現在約3小時

該代碼在這裏發佈抱歉,如果它有點乏味。

了全班同學的ListView S:

package com.DCWebMakers.Vairon; 

import java.util.ArrayList; 
import java.util.List; 
import android.app.Activity; 
import android.app.Dialog; 
import android.content.Intent; 
import android.database.DataSetObserver; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.CursorAdapter; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

public class ManageAppointment extends Activity { 
    ListView rowLi, whenLi, postedLi, detailsLi, editLi, removeLi; 
    ArrayAdapter<String> whenAdapter, postedAdapter, detailsAdapter, 
      editAdapter, removeAdapter; 
    ArrayAdapter<Integer> rowAdapter; 
    final AppointmentInfo information = new AppointmentInfo(this); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     /* 
     * The ListViews created here are not the proper way to make ListViews. 
     * This is for testing purposes and will be updated for efficiency. The 
     * remove also doesn't work properly 
     */ 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.manage_appointment); 
     initVariables(); 
     try { 

      databaseManagement(); 

      detailsLi.setOnItemClickListener(new OnItemClickListener() { 

       public void onItemClick(AdapterView<?> aV, View v, int pos, 
         long arg3) { 
        // TODO Auto-generated method stub 

        Intent openDetails = new Intent(
          "com.DCWebMakers.Vairon.APPOINTMENTDETAILS"); 
        openDetails.putExtra("position", pos); 
        startActivity(openDetails); 

       } 
      }); 
      editLi.setOnItemClickListener(new OnItemClickListener() { 

       public void onItemClick(AdapterView<?> aV, View v, int pos, 
         long arg3) { 
        // TODO Auto-generated method stub 

        Intent openEdit = new Intent(
          "com.DCWebMakers.Vairon.EDITAPPOINTMENT"); 
        openEdit.putExtra("position", pos); 
        startActivity(openEdit); 
        notifyChangesToAdapters(); 

       } 
      }); 

      removeLi.setOnItemClickListener(new OnItemClickListener() { 

       public void onItemClick(AdapterView<?> aV, View v, int pos, 
         long arg3) { 
        // TODO Auto-generated method stub 
        databaseManagement(); 

        information.open(); 
        information.delete(pos); 
        information.close(); 


        Dialog sucDeleted = new Dialog(ManageAppointment.this); 
        sucDeleted.setTitle("Sucesfully deleted"); 
        TextView tvDintWorked = new TextView(ManageAppointment.this); 
        tvDintWorked.setText("The appointment at position:" + pos 
          + " was sucesfully deleted"); 
        sucDeleted.setContentView(tvDintWorked); 
        sucDeleted.show(); 

        notifyChangesToAdapters(); 
       } 
      }); 

     } catch (Exception e) { 

      Dialog showError = new Dialog(this); 
      showError.setTitle("Error"); 
      TextView tvDintWorked = new TextView(this); 
      String error = e.toString(); 
      tvDintWorked.setText(error); 
      showError.setContentView(tvDintWorked); 
      showError.show(); 
     } 

    } 

    public void initVariables() { 
     rowLi = (ListView) findViewById(R.id.rowList); 
     whenLi = (ListView) findViewById(R.id.whenList); 
     postedLi = (ListView) findViewById(R.id.postedList); 
     detailsLi = (ListView) findViewById(R.id.detailsList); 
     editLi = (ListView) findViewById(R.id.editList); 
     removeLi = (ListView) findViewById(R.id.removeList); 
    } 

    @Override 
    protected void onPause() { // TODO Auto-generated method stub 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     notifyChangesToAdapters(); 
    } 

    private void notifyChangesToAdapters() { 
     // TODO Auto-generated method stub 

     rowAdapter.notifyDataSetChanged(); 
     whenAdapter.notifyDataSetChanged(); 
     postedAdapter.notifyDataSetChanged(); 
     detailsAdapter.notifyDataSetChanged(); 
     editAdapter.notifyDataSetChanged(); 
     removeAdapter.notifyDataSetChanged(); 

    } 

    @Override 
    public void onBackPressed() { 
     // TODO Auto-generated method stub 
     super.onBackPressed(); 
     Intent mainIntent = new Intent("com.DCWebMakers.Vairon.MAINMENU"); 
     startActivity(mainIntent); 
    } 

    public void databaseManagement() { 
     information.open(); 
     int primaryKey = information.getKeys(); 
     String when[] = information.getWhen(); 
     String posted[] = information.getPosted(); 
     String details[] = new String[primaryKey]; 
     Integer rowNumber[] = new Integer[primaryKey]; 
     String edit[] = new String[primaryKey]; 
     String delete[] = new String[primaryKey]; 

     for (int set = 0; set < rowNumber.length; set++) { 
      rowNumber[set] = (set); 
     } 
     for (int set = 0; set < details.length; set++) { 
      details[set] = ("Details"); 
     } 
     for (int set = 0; set < edit.length; set++) { 
      edit[set] = ("Edit"); 
     } 

     for (int set = 0; set < delete.length; set++) { 
      delete[set] = ("Delete"); 
     } 

     information.close(); 

     rowAdapter = new ArrayAdapter<Integer>(ManageAppointment.this, 
       android.R.layout.simple_list_item_1, rowNumber); 
     whenAdapter = new ArrayAdapter<String>(ManageAppointment.this, 
       android.R.layout.simple_list_item_1, when); 
     postedAdapter = new ArrayAdapter<String>(ManageAppointment.this, 
       android.R.layout.simple_list_item_1, posted); 
     detailsAdapter = new ArrayAdapter<String>(ManageAppointment.this, 
       android.R.layout.simple_list_item_1, details); 
     editAdapter = new ArrayAdapter<String>(ManageAppointment.this, 
       android.R.layout.simple_list_item_1, edit); 
     removeAdapter = new ArrayAdapter<String>(ManageAppointment.this, 
       android.R.layout.simple_list_item_1, delete); 

     rowLi.setAdapter(rowAdapter); 
     whenLi.setAdapter(whenAdapter); 
     postedLi.setAdapter(postedAdapter); 
     detailsLi.setAdapter(detailsAdapter); 
     editLi.setAdapter(editAdapter); 
     removeLi.setAdapter(removeAdapter); 
    } 

} 

刪除方法:

public void delete(int position) { 
    theDatabase.beginTransaction(); 
    try { 
     theDatabase 
       .delete(DATABASE_TABLE, KEY_ROWID + "=" + position, null); 
     theDatabase.setTransactionSuccessful(); 
    } catch (SQLiteException e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
    } finally { 
     theDatabase.endTransaction(); 
     theDatabase.close(); 
    } 
} 

回答

0

notifyDataSetChanged之前,你需要刪除從List

+0

你的意思是適配器?對不起,簡單的問題,我現在正在嘗試,例如rowLi.removeItemAt(pos);但我收到一個錯誤 – Vairon 2012-02-19 04:11:08

+0

做rowAdapter.remove(pos)不工作 – Vairon 2012-02-19 04:30:29

0

你看到任何異常條目從數據庫中刪除時。並且您還需要在通知之前從全局列表中刪除pos條目。

相關問題