3

I have the following class:

public class Person {

    public String name;
    public String description;

    public Board(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public String getName()
    {
        return this.name;
    }

    public String getDescription()
    {
        return this.description;
    }
}

I then have an ArrayList<Person> with some of this data.

What I want to do is populate my ListView, I have made a (bad) mockup of what I want it to look like:

After looking at some information about this online, I have made a new layout where I have put a Medium TextView, with a Small TextView underneath it, but now I am confused to how I can link that in with the ListView on my MainActivity and then populate it with data from my ArrayList<Person>.

1
  • 2
    Look for ArrayAdapter<Person>, despite its name it can work on List<> as well Commented Dec 23, 2012 at 19:05

3 Answers 3

8

First you need a custom layout for your row:

/res/layout/my_row_layout.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="vertical" >

<TextView
    android:id="@+id/textView_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Medium Text"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
    android:id="@+id/textView_description"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

After, you will need an ArrayAdapter:

public class MyListAdapter extends ArrayAdapter<Person> {

private Context context;
private ArrayList<Person> allPersons;

private LayoutInflater mInflater;
private boolean mNotifyOnChange = true;

public MyListAdapter(Context context, ArrayList<Person> mPersons) {
    super(context, R.layout.my_row_layout);
    this.context = context;
    this.allPersons = new ArrayList<Person>(mPersons);
    this.mInflater = LayoutInflater.from(context);
}

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

@Override
public Person getItem(int position) {
    return allPersons .get(position);
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public int getPosition(Person item) {
    return allPersons .indexOf(item);
}

@Override
public int getViewTypeCount() {
    return 1; //Number of types + 1 !!!!!!!!
}

@Override
public int getItemViewType(int position) {
    return 1;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    int type = getItemViewType(position);
    if (convertView == null) {
        holder = new ViewHolder();
        switch (type) {
        case 1:
            convertView = mInflater.inflate(R.layout.my_row_layout,parent, false);
            holder.name = (TextView) convertView.findViewById(R.id.textview_name);
            holder.description = (TextView) convertView.findViewById(R.id.textview_description);
            break;
        }
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.name.setText(allPersons.get(position).getName());
    holder.description.setText(allPersons.get(position).getDescription());
    holder.pos = position;
    return convertView;
}

@Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
    mNotifyOnChange = true;
}

public void setNotifyOnChange(boolean notifyOnChange) {
    mNotifyOnChange = notifyOnChange;
}


//---------------static views for each row-----------//
     static class ViewHolder {

         TextView name;
         TextView description;
         int pos; //to store the position of the item within the list
     }
}

In your activity, you can do this:

public class SecondActivity extends ListActivity {

    private ArrayList<Person> persons;
    private MyListAdapter mAdapter;

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

        //fill the arraylist of persons

        this.mAdapter = new MyListAdapter(this, persons);
        setListAdapter(mAdapter);

    }

}

Finally:

/res/layout/activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true" >
</ListView>

Attention to the id of the ListView: if you are extending your activity as ListActivity, the id of the list must be @android:id/list.

I hope this help you!

Sign up to request clarification or add additional context in comments.

Comments

1

For this you will need following steps :

1. First Create an Row layout form ListView rows and place it inside res/layout folder

2. Create an Custom Adapter for ListView by extending ArrayAdapter

you can see these tutorials for Creating Custom Adapter for ListView :

http://www.ezzylearning.com/tutorial.aspx?tid=1763429

http://devtut.wordpress.com/2011/06/09/custom-arrayadapter-for-a-listview-android/

Comments

0

If you want to do this with recyclerView follow these steps

1) Create a Layout with RecyclerView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent" >

     <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

2) Create a row ItemView

Create a view row.xml

3) Create an Adapter

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> {

private Context context;
private List<Person> list;

public ListAdapter (Context context, List<Person> list)
{
    this.context = context;
    this.list = list;
}


@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(context).inflate(R.layout.row,parent,false);
    return new ListViewHolder(view);
}

@Override
public void onBindViewHolder(ListViewHolder holder, final int position) {

    final Person person = list.get(position);
    holder.name.setText(person.getName());
    holder.name.setText(person.getDesc());

}

@Override
public int getItemCount() {
    return list.size();
}

class ListViewHolder extends RecyclerView.ViewHolder
{
    private TextView name;
    private ImageView desc;

    public ListViewHolder (View itemView) {
        super(itemView);
        name= (TextView)itemView.findViewById(R.id.name);
        desc= (ImageView)itemView.findViewById(R.id.desc);
    }
 }
}

4) Integrate RecyclerView in Your Activity

public class YourActivity extends AppcompatActivity{

private List<Person> persons;
private YourAdapter adapter;
private RecyclerView rv;

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

    rv = (RecyclerView)findViewById(R.id.rv);
    person = // Get your List
    adapter = new YourAdapter(this, persons);
    setListAdapter(mAdapter);
    LinearLayoutManager llm = new LinearLayoutManager(YourActivity.this);
    rv.setLayoutManager(llm);
    rv.setAdapter(adapter);

}

}

1 Comment

I have an issue with ListAdapter not highlighting search text in the onBindViewHolder() method, here: stackoverflow.com/questions/79041428/… I would appreciate any ideas or insights you might have on how to fix.

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.