Reputation: 8362
I have a list view with 14 rows, with each item as View Pager. Here is my getView() Method:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
FindMyBeerPager findMyBeerPager;
if(convertView==null){
holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.beer_list_item, parent,false);
findMyBeerPager = new FindMyBeerPager(context, findBeerDataList.get(position));
holder.beerPager = (ViewPager)convertView.findViewById(R.id.mypager);
holder.beerPager.setAdapter(findMyBeerPager);
System.out.println("Recycling view position"+position);
holder.beerPager.setTag(findMyBeerPager);
convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
System.out.println("Recycled"+position);
}
return convertView;
}
}
class ViewHolder{
ViewPager beerPager;
}
Problem: The problem I am facing is that, when I scroll down the list view I am not getting further rows values,i.e the list view is recycled with the previous values. I don't know why this is going on. I have to send the View Pager (data item for every position). Before Scrolling down everything works fine.
Upvotes: 2
Views: 1948
Reputation: 7226
It can work without setting parameter on every getView(), but for that you need to extend BaseAdapter and overload following methods:
@Override
public boolean hasStableIds() {
return true;
}
@Override
public int getCount() {
return items.size();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return MAXIMUM_NUMBER_OF_ITEMS_IN_LIST_VIEW;
}
In this way BaseAdapter will keep in recycler separate view for every element. It's good solution for short lists with custom views inflated for each item. (but can work also when inflated views are the same)
Notice that getViewTypeCount() is invoked only once on constructor, so BaseAdapter must know then how many items your list will have.
Crucial for the idea is getItemViewType() returning different value for each item. Thanks to that getView() will be getting unique convertView for every list item.
Then you can completely skip condition (convertView != null) and put all code into (convertView == null){}
Upvotes: 1
Reputation: 133560
Change getView to
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
FindMyBeerPager findMyBeerPager;
if(convertView==null){
holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.beer_list_item, parent,false);
holder.beerPager = (ViewPager)convertView.findViewById(R.id.mypager);
convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
}
findMyBeerPager = new FindMyBeerPager(context, findBeerDataList.get(position));
holder.beerPager.setTag(findMyBeerPager);
holder.beerPager.setAdapter(findMyBeerPager);
return convertView;
}
}
You can move LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
to the constructor of adapter class.
Also use Log
for logging instead of System.out.println
How ListView's recycling mechanism works
ViewPager and OnItemClickListener in ListView
Check the answer by Dianne Hackborn in the above link.
Upvotes: 3
Reputation: 876
Can you try setting the adapter in the esle block?
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
FindMyBeerPager findMyBeerPager;
if(convertView==null){
holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.beer_list_item, parent,false);
holder.beerPager = (ViewPager)convertView.findViewById(R.id.mypager);
System.out.println("Recycling view position"+position);
holder.beerPager.setTag(findMyBeerPager);
convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
System.out.println("Recycled"+position);
findMyBeerPager = new FindMyBeerPager(context, findBeerDataList.get(position));
holder.beerPager.setAdapter(findMyBeerPager);
}
return convertView;
}
}
Upvotes: 1