2015-07-28 2 views
-3

Я провел дни, проходя через форумы, и не нашел решения.Android Studio SQLite Query to listview

Я пытаюсь получить все записи из базы данных и показать их в ListView

public class list_loans extends Activity { 

    ListView loanList; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list_loans); 

     //Instantiate Database helper 
     DataBaseHelper myDbHelper = new DataBaseHelper(this); 
     ArrayList<personObject> myArray = new ArrayList<>(); 
     //Open writable database 
     SQLiteDatabase db = myDbHelper.getWritableDatabase(); 

     Cursor resultSet = db.rawQuery("SELECT * FROM borrower", null); 

     //TODO: Print out single list of item, not list for each item!** 
     if (resultSet != null) { 

      personObject myPerson = null; 
      if (resultSet.moveToFirst()) { 
       do { 

        String nameOut = resultSet.getString(1); 
        String phoneOut = resultSet.getString(2); 
        String addressOut = resultSet.getString(3); 
        Integer itemID = resultSet.getInt(4); 
        String itemType = resultSet.getString(5); 
        String itemDesc = resultSet.getString(6); 

        myPerson = new personObject(nameOut, phoneOut, addressOut, itemID, itemType, 
          itemDesc); 

       }while (resultSet.moveToNext()); 
      } 
      myArray.add(myPerson); 
      loanList = (ListView) findViewById(R.id.loanList); 
      //TODO: loop through array and add each item to list, instead of entire array to list** 
      loanList.setAdapter(new listAdapter(this, myArray)); 
      resultSet.close(); 
      db.close(); 
     } 
    } 

Мой адаптер:

package com.creativenative.jonathan.loanme; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

import java.util.ArrayList; 

/** 
* Created by Jonathan on 7/17/2015. 
*/ 
class listAdapter extends BaseAdapter { 

Context context; 
ArrayList data; 
private static LayoutInflater inflater = null; 

public listAdapter(Context context, ArrayList data) { 
    this.context = context; 
    this.data = data; 
    inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    return data.size(); 
} 

@Override 
public Object getItem(int position) { 
    return data; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View vi = convertView; 
    if (vi == null) 
     vi = inflater.inflate(R.layout.row, null); 
     TextView text = (TextView) vi.findViewById(R.id.text); 
     text.setText(data.toString()); 
    return vi; 
} 
} 

Ожидаемый результат:

Header Item 1 
Item 1 details 

Header Item 2 
Item 2 details 

Actual выход:

Header item 1 
Item 1 details 
Header item 2 
Item 2 details 

Header item 1 
Item 1 details 
Header item 2 
Item 2 details 

Каждый раз, когда я добавить элемент в базу данных, это добавляет еще один элемент списка, который содержит все, что в базе данных: Я не могу

Header item 1 
Item 1 details 
Header item 2 
Item 2 details 
Header item 3 
Item 3 details 

Header item 1 
Item 1 details 
Header item 2 
Item 2 details 
Header item 3 
Item 3 details 

Header item 1 
Item 1 details 
Header item 2 
Item 2 details 
Header item 3 
Item 3 details 

выяснить:

Добавить другой выход элемента как получить каждый элемент в отдельном месте в списке. Любая помощь очень ценится, как обычно ... Кроме того, я знаю, что эта проблема была рассмотрена раньше, но даже прохождение других сообщений не помогло.

+1

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

ответ

0

В адаптере, изменить

@Override 
public Object getItem(int position) { 
    return data; 
} 

в

@Override 
public Object getItem(int position) { 
    return data.get(position); 
} 

Поскольку в настоящее время метод getItem(int position) возвращает весь набор данных, вместо этого пункта на нужную позицию.

Редактировать

поведения вы ожидаете из-за ваш цикл. Посмотрите на следующий фрагмент кода твоего:

personObject myPerson = null; 
if (resultSet.moveToFirst()) { 
    do { 
     String nameOut = resultSet.getString(1); 
     String phoneOut = resultSet.getString(2); 
     String addressOut = resultSet.getString(3); 
     Integer itemID = resultSet.getInt(4); 
     String itemType = resultSet.getString(5); 
     String itemDesc = resultSet.getString(6); 

     myPerson = new personObject(nameOut, phoneOut, addressOut, itemID, itemType, 
       itemDesc); 

    }while (resultSet.moveToNext()); 
} 

myArray.add(myPerson); 
//The above line of code is executed after your loop has finished. 
//The result of this is that you only add the latest entry from your DB. 
//Furthermore, your adapter is only displaying this data. 

Ваш цикл должен выглядеть следующим образом:

personObject myPerson = null; 
if (resultSet.moveToFirst()) { 
    do { 
     String nameOut = resultSet.getString(1); 
     String phoneOut = resultSet.getString(2); 
     String addressOut = resultSet.getString(3); 
     Integer itemID = resultSet.getInt(4); 
     String itemType = resultSet.getString(5); 
     String itemDesc = resultSet.getString(6); 

     myPerson = new personObject(nameOut, phoneOut, addressOut, itemID, itemType, 
       itemDesc); 

     myArray.add(myPerson); 
    }while (resultSet.moveToNext()); 
} 

Эти изменения будут добавлять все записи из БД в свой список.

Edit 2

Так, в адаптере ...

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View vi = convertView; 
    if (vi == null) 
     vi = inflater.inflate(R.layout.row, null); 

    TextView text = (TextView) vi.findViewById(R.id.text); 
    text.setText(data.toString()); //this makes no sense. You are converting an ArrayList to String? 
    return vi; 
} 

изменение

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View vi = convertView; 
    if (vi == null) 
     vi = inflater.inflate(R.layout.row, null); 

    TextView text = (TextView) vi.findViewById(R.id.text); 
    text.setText(data.get(position).getNameOut()); //Or whatever you want to display 
    return vi; 
} 
+0

Это решение делает успехи. Теперь он отображает только один элемент в списке, но он отображает только последний элемент из db, а не все элементы ... –

+0

Посмотрите на свои базовые данные. Когда вы создаете свой список (myArray) и назначаете свой адаптер этому списку, что находится в этом списке? @Jon Smith – Marcus

+0

@ Jon Smith намек: это только один объект в списке. Зачем?Потому что вы просматриваете свой набор результатов, но не добавляете каждую запись в свой список, а только последний. Я нахожусь на своем телефоне, но когда я доберусь до компиля, я отредактирую свой ответ, чтобы показать вам – Marcus