Reputation: 3899
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
Reputation: 18202
If you want to do this with recyclerView follow these steps
<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>
Create a view row.xml
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);
}
}
}
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
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
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