2012-02-19 27 views
2

プログラミングスタイルが悪く、Androidで未熟なために、私は本当に不満です。みんなに申し訳ありません。データベースが変更された後にリストビューが更新されない

アプリ仕組み:

これは私の職業訓練のためのToDoアプリです。 6列あります。 これらのうち3つはToDoに関する情報を含み、他の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); 
    } 

} 

削除方法:あなたはすべての例外を見ましたList

答えて

0

データベースから削除するとき。通知する前にグローバルリストからposエントリを削除する必要もあります。

+0

アダプターを意味しますか?申し訳ありませんが単純な質問のために、私は今、例えばrowLi.removeItemAt(pos);それをやってみています。しかし、私はエラー – Vairon

+0

rowAdapter.remove(pos)を実行してもうまくいきませんでした – Vairon

0

からエントリを削除する必要がnotifyDataSetChanged

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(); 
    } 
} 
関連する問題