0

Я использую ListFragment для отображения данных из базы данных. Но данные отображаются неправильно.Использование SQLite с ListFragment создает проблемы

Внутри моего фрагмента добавить в контакт с базой данных SQLite после того, как пользователь нажал на пункт ActionBar и вставить имя:

//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); 
    } 
} 

Тогда я хочу, чтобы все контакты и показать их в ListFragment с этим кодом:

@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); 
    } 

в getAllContacts() из моего DatabaseHandler:

// Getting All Contacts 
public List<Contact> getAllContacts() { 
    List<Contact> contactList = new ArrayList<Contact>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      Contact contact = new Contact(); 
      contact.setID(Integer.parseInt(cursor.getString(0))); 
      contact.setName(cursor.getString(1)); 
      contact.setPhoneNumber(cursor.getString(2)); 
      // Adding contact to list 
      contactList.add(contact); 
     } while (cursor.moveToNext()); 
    } 

    // return contact list 
    return contactList; 
} 

Но в моем ListFragment следующего показано:

[email protected] 

Я хотел бы видеть имя контакта. Любая идея?

+0

'com.example.fragmentmasterdetail.sqlite.Contact @ 21059ed8' является результатом по умолчанию от' ToString() '(член в каждом классе Java Object), просто переопределите это, чтобы вернуть что-то полезное. – Sam

ответ

3

согласно ArrayAdapter documentation:

Однако является ссылкой TextView, она будет заполнена с ToString() каждого объекта в массиве. Вы можете добавлять списки или массивы пользовательских объектов. Переопределите метод toString() ваших объектов, чтобы определить, какой текст будет отображаться для элемента в списке.

Поэтому, чтобы получить свой текст в свой список, добавить метод toString()Contact к вашему классу:

public String toString() 
{ 
    return name; 
} 
+0

Я уже реализовал эту функцию, но где мне нужно использовать эту функцию? Извините за эти простые вопросы ... –

+1

Я отредактировал свой ответ - ArrayAdapters используют toString(), чтобы определить, какой текст будет заполняться для каждого элемента. Он называется ArrayAdapter, а не вручную вами. – ianhanniballake

+0

А теперь хорошо, что это работает, спасибо вам большое! –