Wyświetlenie listy w widoku ListView

0

Witajcie,
Zabrałem się Panowie za przeróbkę swojej metody pobierającej dane z bazy SQLite. Poprzednio korzystałem z ArrayList HashMap jednak @wojciechmaciejewski zasugerował aby to przerobić ponieważ HashMap jest bardzo zasobożerny. Więc ok, stworzyłem sobie klasę do obsługi wartości pobieranych z bazy:

public class ValuesPlayers {
    private long id;
    private String namePlayer;

    public ValuesPlayers() {
        super();
    }

    public ValuesPlayers(String namePlayer) {
        super();
        this.namePlayer = namePlayer;
    }

    public ValuesPlayers(long id, String namePlayer) {
        super();
        this.id = id;
        this.namePlayer = namePlayer;
    }

    public ValuesPlayers(long id) {
        super();
        this.id = id;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getNamePlayer() {
        return namePlayer;
    }

    public void setValue(String namePlayer) {
        this.namePlayer = namePlayer;
    }
}

następnie w klasie obsługującej bazę utworzyłem metodę która pobiera mi dane do listy:

public List<ValuesPlayers> getAllPlayers() {
        List<ValuesPlayers> playerList = new ArrayList<ValuesPlayers>();
        SQLiteDatabase db = this.getReadableDatabase();
        String sqlSelect = "SELECT " + _id + ", " +
                columnPlayerName  + " FROM " + TABLE_NAME;
        Cursor select = db.rawQuery(sqlSelect, null);


        if(select.moveToFirst()) {
            do {
                ValuesPlayers player = new ValuesPlayers();
                player.setId(Integer.parseInt(select.getString(0)));
                player.setValue(select.getString(1));
                playerList.add(player);
            }
            while(select.moveToNext());
        }
        return playerList;
    }

Teraz chciałbym Was prosić o pomoc, z czego należy skorzystać aby tą listę móc wyświetlić w widoku ListView w dwóch kolumnach? Mam utworzoną aktywność z listą oraz XML-a z widokiem listy (dwa elementy TextView):

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:stretchColumns="*">

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <TextView
            android:id="@+id/id"
            android:layout_column="0"
            android:padding="0dp"
            android:layout_span="2"
            />

        <TextView
            android:id="@+id/playerNameListView"
            android:layout_column="1"
            android:padding="0dp"
            />
    </TableRow>
</TableLayout>

---EDIT---
Czy w ogóle istnieje inna metoda na wyświetlenie takiej listy w dwóch kolumnach w widoku listVeiw? Przesiedziałem całą noc aby coś znaleźć i wszystkie przykłady jakie znalazłem do wyświetlania kilku kolumn (na razie dwie ale docelowo będzie ich 5 - 6) korzystają właśnie z HashMap. Mówiąc szczerze to nie mogę znaleźć innego sposobu na wyświetlenie zawartości listy jaką zbudowałem.

0

Co prawda musiałem wszystko poprawić ale w końcu po wielu godzinach się udało. Teraz muszę to co napisałem dobrze zrozumieć dlatego (prośba szczególnie do Ciebie @wojciechmaciejewski ) gdyby ktoś z Was był tak uprzejmy i jakoś króciutko wytłumaczył co i jak tu się dzieje. Wzorowałem się na przykładzie ale opisy były po hiszpańsku a ja hiszpańskiego nie znam ani trochę :(.

Klasa ValuesPlayers:

public class ValuesPlayers {
    private int id;
    private String namePlayer;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNamePlayer() {
        return namePlayer;
    }

    public void setNamePlayer(String namePlayer) {
        this.namePlayer = namePlayer;
    }
}

Klasa PlayerBaseAdapter:

public class PlayerBaseAdapter extends BaseAdapter {
    private List<ValuesPlayers> valuesPlayers;
    private Context context;

    public PlayerBaseAdapter(List<ValuesPlayers> valuesPlayers, Context context) {
        this.valuesPlayers = valuesPlayers;
        this.context = context;

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

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

    @Override
    public long getItemId(int position) {
        return valuesPlayers.get(position).getId();
    }

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

        if(convertView == null) {
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.row_players, null);
        }

        ValuesPlayers player = this.valuesPlayers.get(position);
        TextView id = (TextView) view.findViewById(R.id.id);
        TextView playerNameListView = (TextView) view.findViewById(R.id.playerNameListView);

        id.setText(String.valueOf(player.getId()));
        playerNameListView.setText(player.getNamePlayer());

        return view;
    }
}

Metoda w klasie DatabaseHelperPlayer:

 public List<ValuesPlayers> getAllPlayers() {
        List<ValuesPlayers> playerList = new ArrayList<ValuesPlayers>();
        SQLiteDatabase db = this.getReadableDatabase();
        String sqlSelect = "SELECT " + _id + ", " +
                columnPlayerName  + " FROM " + TABLE_NAME;
        Cursor select = db.rawQuery(sqlSelect, null);


        if(select.moveToFirst()) {
            do {
                ValuesPlayers player = new ValuesPlayers();
                player.setId(Integer.parseInt(select.getString(0)));
                player.setNamePlayer(select.getString(1));
                playerList.add(player);
            }
            while(select.moveToNext());
        }
        return playerList;
    }

I na koniec fragment klasy MainActivity który odpowiada za wywołanie całości i wyświetlenie listy:

ListView playersList;
DatabaseHelperPlayer playerDb = new DatabaseHelperPlayer(this);
...
...
playersList = (ListView) findViewById(R.id.listPlayer);
List<ValuesPlayers> allPlayers = playerDb.getAllPlayers();
PlayerBaseAdapter adt = new PlayerBaseAdapter(allPlayers, getApplicationContext());
playersList.setAdapter(adt);
registerForContextMenu(playersList);
0

Pytanie jest co chcesz osiągnąć . Nazywanie TextView

playerNameListView

sugeruje coś zupełnie innego niż rzeczywiście jest. Przez to kod robi się nie czytelny.

Nie bardzo rozumiem czego nie wiesz i z czym jest problem. Pobierasz dane z bazy danych , wkładasz je do adaptera i ustawiasz Adapter na ListView. Jeżeli chcesz mieć wyświetlone w wiecej niz 1 kolumnie skorzystaj z GridView albo RecyclerView a nie ListView i tyle

0

Koledze chyba chodzi o ogólną wiedzę na temet tego do czego służy ten adapter. A służy on właśnie do tego aby zrobić sobie customowy widok listy. Podstawowy widok listy zapewnia Ci przekazanie tylko listy lub tablicy danych. Tutaj możesz skorzystać z obrazków, checkboxów i czego tylko sobie zamarzysz.

0

No dobra, to ciągnę temat z RacyclerView. Czy to jest jakaś kontrolka którą wstawiam podobnie do ListView? Bo szukam i tego nie widzę. Ok, GridView jest i mogę go wrzucić poprzez przeciągnięcie. RecyclerView muszę sobie zam ręcznie zakodować w XML-u?

1

Przede wszystkim musisz dołączyć to jako support do gradle.
http://developer.android.com/training/material/lists-cards.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1