wow
wow

Reputation: 3899

Populating a custom ListView from ListArray

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>.

Upvotes: 3

Views: 3619

Answers (3)

Rohit Singh
Rohit Singh

Reputation: 18202

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

}

}

Upvotes: 0

amp
amp

Reputation: 12352

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!

Upvotes: 8

ρяσѕρєя K
ρяσѕρєя K

Reputation: 132982

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/

Upvotes: 1

Related Questions