Ich habe ein mysteriöses Problem gefunden, das ein Fehler sein kann! Ich habe eine Liste in meinem Fragment. Jede Zeile hat eine Schaltfläche. Die Liste sollte nicht auf Klicken reagieren, aber die Schaltflächen sind anklickbar.Android, List Adapter gibt falsche Position in getView zurück
Um zu bekommen, welche Schaltfläche geklickt hat, habe ich einen Listener erstellt und in meinem Fragment implementiert. Dies ist der Code meines Adapters.
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<MutualFriends> userList;
public AddFriendsAdapter(Context context) {
this.context = context;
myInflater = LayoutInflater.from(context);
imageDownloader = ImageDownloader.getInstance(context);
}
public void setData(List<MutualFriends> 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;
}
}
Wenn ich die app laufen, kann ich meine Zeilen aber da meine Liste ist lang und hat über 200 Artikel, wenn ich gehe zu Mitte und klicken Sie auf ein Element sehen dann zurück Position falsch ist (es ist so etwas wie 7, manchmal 4 und usw.).
Nun, was ist das Geheimnis? Wenn ich auf Element Listener der Liste von meinem Fragment aktiviere und auf Zeile klicke, dann wird die korrekte Zeilenposition angezeigt, während ich auf dieser Zeile klicke, wenn ich auf die Schaltfläche klicke, dann wird die falsche Position angezeigt.
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.e(TAG, "item " + position + " clicked.");
}
});
Ergebnis 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
Jeder Vorschlag würde geschätzt. Dank
Wo implementieren Sie 'OnAddUserClicked()'? Auch wenn Sie einen BaseAdapter und 'List' verwenden, können Sie Ihren Adapter vereinfachen, indem Sie 'ArrayAdapter' verwenden, da er im Grunde _is_' List' ist und das genaue Problem des Ladens eines Arrays oder einer Liste von Datenobjekten in ein AdapterView –
FoamyGuy