Showing posts with label List Adapter returns wrong position in getView. Show all posts
Showing posts with label List Adapter returns wrong position in getView. Show all posts

Thursday, May 9, 2013

[android help] Android, List Adapter returns wrong position in getView


I have found a mysterious problem that may be a bug! I have a list in my fragment. Each row has a button. List shouldn't respond to click however buttons are clickable.


In order to get which button has clicked I have created a listener and implement it in my fragment. This is the code of my adapter.



public class AddFriendsAdapter extends BaseAdapter {

public interface OnAddFriendsListener {
public void OnAddUserClicked(MutualFriends user);
}

private final String TAG = "*** AddFriendsAdapter ***";

private Context context;
private OnAddFriendsListener listener;
private LayoutInflater myInflater;
private ImageDownloader imageDownloader;
private List userList;

public AddFriendsAdapter(Context context) {
this.context = context;
myInflater = LayoutInflater.from(context);

imageDownloader = ImageDownloader.getInstance(context);
}

public void setData(List userList) {
this.userList = userList;

Log.i(TAG, "List passed to the adapter.");
}

@Override
public int getCount() {
try {
return userList.size();
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;

if (convertView == null) {
convertView = myInflater.inflate(R.layout.list_add_friends_row, null);
holder = new ViewHolder();

Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/ITCAvantGardeStd-Demi.ttf");
holder.tvUserName = (TextView) convertView.findViewById(R.id.tvUserName);
holder.tvUserName.setTypeface(font);
holder.ivPicture = (ImageView) convertView.findViewById(R.id.ivPicture);
holder.btnAdd = (Button) convertView.findViewById(R.id.btnAdd);
holder.btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(TAG, "Item: " + position);
listener.OnAddUserClicked(userList.get(position));
}
});

convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.tvUserName.setText(userList.get(position).getName());
imageDownloader.displayImage(holder.ivPicture, userList.get(position).getPhotoUrl());

return convertView;
}

public void setOnAddClickedListener(OnAddFriendsListener listener) {
this.listener = listener;
}

static class ViewHolder {
TextView tvUserName;
ImageView ivPicture;
Button btnAdd;
}
}


When I run the app, I can see my rows however since my list is long and has over 200 items when i goto middle of list and click an item then returned position is wrong (it's something like 7, sometimes 4 and etc.).


Now what is the mystery? If I active on item listener of list from my fragment and click on row then correct row position will be displayed while on that row if I click on button then wrong position will be displayed.



listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
Log.e(TAG, "item " + position + " clicked.");
}
});


Result in logcat:



05-09 10:22:25.228: E/AddFriendsFragment(20296): item 109 clicked.
05-09 10:22:34.453: E/*** AddFriendsAdapter ***(20296): Item: 0


Any suggestion would be appreciated. Thanks



.

stackoverflow.comm

Google Voice on T-Mobile? [General]

Google Voice on T-Mobile? So I recently switched from a GNex on Verizon to a Moto X DE on T-Mobile. I had always used Google Voice for my v...