Repeating items in ListView?
android, android-listview, custom-adapter
Solution
You are facing that data repeat issue, just because you aren't following the exact standards of implementing View-Holder pattern.
Wrong:
Here you are doing findViewById() and setting data if view is null, so it will be running fine for first set of items, afterword it will show you the same data for the next sets of items.
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v = convertView;
ViewHolder holder;
if (v == null) {
try {
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.group_item, null);
holder = new ViewHolder();
holder.tv_group_name = (TextView) v
.findViewById(R.id.tv_group_name);
String group_name = group_details.get(position).getGroup_name();
holder.tv_group_name.setText(group_name);
holder.tv_group_name.setTypeface(face);
holder.tv_group_reg_id = (TextView) v
.findViewById(R.id.tv_group_reg_id);
String groupRegId = group_details.get(position)
.getGroup_reg_id();
holder.tv_group_reg_id.setText(groupRegId);
holder.tv_group_reg_id.setTypeface(face);
holder.tv_subscriber_count = (TextView) v
.findViewById(R.id.tv_subscriber_count);
holder.tv_subscriber_count.setText(group_details.get(position)
.getSubscriber_count());
v.setTag(holder);
} catch (Exception e) {
e.printStackTrace();
}
} else
holder = (ViewHolder) v.getTag();
return v;
}
Correct:
Correct way to implement View Holder pattern is to find views if current view is null (that would happen for the first time) and set data only after doing it. So eventually `findViewById()` process will be done for the first time and next time onwards it will get views by using attached tags.
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v = convertView;
ViewHolder holder;
if (v == null) {
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.group_item, null);
holder = new ViewHolder();
holder.tv_group_name = (TextView) v
.findViewById(R.id.tv_group_name);
holder.tv_group_reg_id = (TextView) v
.findViewById(R.id.tv_group_reg_id);
holder.tv_subscriber_count = (TextView) v
.findViewById(R.id.tv_subscriber_count);
v.setTag(holder);
} catch (Exception e) {
e.printStackTrace();
}
} else
holder = (ViewHolder) v.getTag();
String group_name = group_details.get(position).getGroup_name();
holder.tv_group_name.setText(group_name);
holder.tv_group_name.setTypeface(face);
String groupRegId = group_details.get(position)
.getGroup_reg_id();
holder.tv_group_reg_id.setText(groupRegId);
holder.tv_group_reg_id.setTypeface(face);
holder.tv_subscriber_count.setText(group_details.get(position)
.getSubscriber_count());
return v;
}
Problem
Everything was working fine but now I am not getting what is happening,I have 10 items to display in the listView,its working fine till the 6th item and after that it repeats again from the 1st item again?? ``` public class GroupDetailsAdapter extends BaseAdapter { List<GetSetGroupDetails> group_details = new ArrayList<GetSetGroupDetails>(); Context context; Typeface face; public GroupDetailsAdapter(List<GetSetGroupDetails> group_details, Context context) { super(); this.group_details.clear(); this.group_details = group_details; this.context = context; face = Typeface.createFromAsset(context.getAssets(), "HelveticaNeueLTStd-Th.otf"); } @Override public int getCount() { // TODO Auto-generated method stub int count = group_details.size(); return count; } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View v = convertView; ViewHolder holder; if (v == null) { try { LayoutInflater vi = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.group_item, null); holder = new ViewHolder(); holder.tv_group_name = (TextView) v .findViewById(R.id.tv_group_name); String group_name = group_details.get(position).getGroup_name(); holder.tv_group_name.setText(group_name); holder.tv_group_name.setTypeface(face); holder.tv_group_reg_id = (TextView) v .findViewById(R.id.tv_group_reg_id); String groupRegId = group_details.get(position) .getGroup_reg_id(); holder.tv_group_reg_id.setText(groupRegId); holder.tv_group_reg_id.setTypeface(face); holder.tv_subscriber_count = (TextView) v .findViewById(R.id.tv_subscriber_count); holder.tv_subscriber_count.setText(group_details.get(position) .getSubscriber_count()); v.setTag(holder); } catch (Exception e) { e.printStackTrace(); } } else holder = (ViewHolder) v.getTag(); return v; } class ViewHolder { TextView tv_group_name; TextView tv_group_reg_id; TextView tv_subscriber_count; } } ```