0

안녕하세요. SQLite 데이터베이스에서 연락처를 추가하는 ListFragment를 사용하고 있습니다. ListFragment를 새로 고치고 싶지만 작동하지 않습니다.Android : ListFragment가 새로 고침되지 않습니다.

//Handle OnClick events on ActionBar items 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // handle item selection 
    switch (item.getItemId()) { 
     case R.id.menu_add: 
     Toast.makeText(getActivity(), "Click", Toast.LENGTH_SHORT).show(); 

     LayoutInflater factory = LayoutInflater.from(getActivity()); 

     //textEntryView is an Layout XML file containing text field to display in alert dialog 
     textEntryView = factory.inflate(R.layout.dialog_add_room, null);  

     //get the control from the layout  
     enter_room = (EditText) textEntryView.findViewById(R.id.enter_room); 

     //create Dialog 
     final AlertDialog.Builder alert1 = new AlertDialog.Builder(getActivity()); 
     //configure dialog 
     alert1.setTitle("Raum hinzufügen:").setView(textEntryView) 
     .setPositiveButton("Hinzufügen", 
       new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, 
        int whichButton) { 
       String roomname = enter_room.getText().toString(); 

       Log.d("Insert: ", "Inserting .."); 
       dbHandler.addContact(new Contact(roomname, "0")); 

       adapter.notifyDataSetChanged(); 
      } 
     }).setNegativeButton("Abbrechen", 
       new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, 
        int whichButton) { 
       //cancel dialog 
      } 
     }); 
     alert1.show();   
     return true; 
     default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

에서 OnCreate() 메소드 내부에 정의 된 어댑터 :

는 ListFragment에 연락처를 추가하는 액션 바의 항목을 클릭 후에 AlertDialog를 표시하는 내 조각 내부의 코드
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //display ActionBar items 
    setHasOptionsMenu(true); 

    //database 
    dbHandler = new DatabaseHandler(getActivity()); 

    //get all contacts 
    contacts = dbHandler.getAllContacts(); 

    adapter = new ArrayAdapter<Contact>(getActivity(), 
      android.R.layout.simple_list_item_activated_1, 
      android.R.id.text1, contacts); 

    adapter.setNotifyOnChange(true); 

    //show all contacts in the ListFragment 
    setListAdapter(adapter); 
} 

무엇이 문제인가?

답변

1

귀하의 onCreate 코드는 클래스를 사용하여 데이터베이스의 모든 연락처를 배열로 배열하거나 List 어떤 종류의 코드를로드합니다. 나중에 클릭 핸들러가 데이터베이스에 다른 연락처를 추가하지만 배열을 변경하지는 않습니다. ArrayAdapter은 데이터베이스가 아닌 배열에 대해서만 알고 있으므로 adapter.notifyDataSetChanged();은 효과가 없습니다.

두 가지 접근 방법이 있습니다.

  1. 당신은 Loader으로 ArrayAdapter 및 셋업 코드를 대체 할 수있다. 이를 수행하는 가장 쉬운 방법은 ContentProvider을 통해 데이터베이스에 액세스하는 것입니다. 즉, CursorLoader을 사용할 수 있고 데이터베이스가 변경된 경우 어댑터를 업데이트하는 것을 의미합니다 (변경 사항이 Service 또는 Activity 인 경우에도 해당됨). ContentProvider의 오버 헤드를 원하지 않아도 Loader을 계속 사용할 수 있지만 작업량이 적습니다. 어느 경우 든 Loader은 백그라운드 스레드에서로드를 수행하는 이점을 제공하므로 연락처가 많을 때 "응답하지 않는 응용 프로그램"을 얻지 못합니다. 자세한 내용은 the loaders guide on Android Developers을 참조하십시오.

  2. 이 문제에 대한보다 신속하고 단기적인 해결책은 데이터베이스 업데이트와 동시에 어댑터에 지정한 배열을 편집하는 것입니다. 당신은

    Contact newContact = new Contact(roomname, "0"); 
    dbHandler.addContact(newContact); 
    contacts.add(newContact); 
    

    이 방법을 선

    dbHandler.addContact(new Contact(roomname, "0")); 
    

    를 대체하여이 작업을 수행 할 수 있습니다, 당신은 변경하거나 연락처를 제거 할 때 비슷한 일을해야 할 것이다, 그리고 경우는 업데이트되지 않습니다 당신의 데이터베이스가 외부에서 변경되었습니다 ListFragment. 이러한 여분의 통화를 계속 추가 할 수 있지만 결국에는 작동하도록 다른 방법을 사용해야하는 작업에 대비할 것입니다.

+0

자세한 답변을 주셔서 감사합니다. ContentProvider를 구현하려고합니다. 이것은 내 눈에서 최고의 솔루션처럼 보입니다. ContentProvider를 사용하지 않으므로 구현하기까지 다소 시간이 걸릴 것입니다. –

관련 문제