3

I want a page with highscores. I made a row.xml for the layout and I made a custom ArrayAdapter. When I print out my objects, I get the right info but it does not come into my list view. It shows nothing at all.

Here is my row.xml

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


    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/txtNumber"
        android:layout_weight="1"
        android:layout_gravity="center_horizontal"
        android:text="@string/txtNumber" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/txtName"
        android:id="@+id/txtName"
        android:layout_gravity="top|bottom"
        android:layout_weight="1" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/txtScore"
        android:id="@+id/txtScore"
        android:layout_weight="1" />


</LinearLayout>

My custom arrayAdapter

Package be.ehb.dt.multiscreen_highscores;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;

// ** * Created by Naomi on 17/12/15. */

public  class PersonAdapter extends ArrayAdapter<Person> {

    public PersonAdapter(Context context, ArrayList<Person> personen) {
        super(context,0, personen);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        Person person = getItem(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.row, parent, false);
        }

        TextView txtNumber = (TextView) convertView.findViewById(R.id.txtNumber);
        TextView txtName = (TextView) convertView.findViewById(R.id.txtName);
        TextView txtScore = (TextView) convertView.findViewById(R.id.txtScore);

        txtNumber.setText(""+person.number);
        txtName.setText(person.name);
        txtScore.setText(""+person.score);
    return convertView;
    }
}

And my mainActivity

package be.ehb.dt.multiscreen_highscores;


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.util.Log;
import android.widget.ListView;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity{
    private ArrayList<Person> personen;

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

        ArrayList<Person> arrayOfPersons = new ArrayList<Person>();
        PersonAdapter adapter = new PersonAdapter(this,arrayOfPersons);
        ListView v = (ListView) findViewById(R.id.listHighscores);


        personen=new ArrayList<>();
        personen.add(new Person(1,"Naomi",3454));
        personen.add(new Person(2,"Steven",2394));
        personen.add(new Person(3, "Lieven", 2254));
        Log.d("print",personen.get(1).toString());
        v.setAdapter(adapter);

    }

}
9
  • return personen.size() in getCount() method. Commented Dec 17, 2015 at 13:14
  • use BaseAdapter instead when using POJO for dataholding Commented Dec 17, 2015 at 13:15
  • @YogeshSeralia Why ? Why can't use Array adapter? Commented Dec 17, 2015 at 13:18
  • @PiyushGupta I don't see where a getCount method is used? I am very new to android. Commented Dec 17, 2015 at 13:19
  • In adapter class. Its a override method. Just copy paste my code Commented Dec 17, 2015 at 13:19

1 Answer 1

4

You should modify your adapter code like ,

ArrayList<Person> personen;
public class PersonAdapter extends ArrayAdapter<Person> {

public PersonAdapter(Context context, ArrayList<Person> personen) {
    super(context,0, personen);
    this.personen = personen;

}

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

Now get here Person person = personen.get(position);

Edit:

    ListView v = (ListView) findViewById(R.id.listHighscores);
    personen=new ArrayList<>();
    personen.add(new Person(1,"Naomi",3454));
    personen.add(new Person(2,"Steven",2394));
    personen.add(new Person(3, "Lieven", 2254));
    Log.d("print",personen.get(1).toString());
    PersonAdapter adapter = new PersonAdapter(this,personen)
    v.setAdapter(adapter);
Sign up to request clarification or add additional context in comments.

3 Comments

That's pointless. Take a look at the ArrayAdapter#getCount() method, it's already implemented like so: return mObjects.size() where mObjects is an array of objects you passed into your adapter.
@aga Where did you see that ?
@PiyushGupta I noticed my mistake thanks to your comment. I didn't use the ArrayList personen. I changed it to : ArrayList<Person> arrayOfPersons = new ArrayList<Person>(); PersonAdapter adapter = new PersonAdapter(this,arrayOfPersons); ListView v = (ListView) findViewById(R.id.listHighscores); adapter.add(new Person(1, "Naomi", 3454)); adapter.add(new Person(2,"Steven",2394)); adapter.add(new Person(3, "Lieven", 2254)); v.setAdapter(adapter);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.