Znalazłem tajemniczy problem, który może być błędem! Mam listę w moim fragmencie. Każdy rząd ma przycisk. Lista nie powinna odpowiadać na kliknięcia, jednak przyciski są klikalne.Android, List Adapter zwraca błędną pozycję w getView
Aby uzyskać kliknięcie przycisku, utworzyłem detektor i zaimplementowałem go w moim fragmencie. To jest kod mojego adaptera.
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;
}
}
Kiedy uruchomić aplikację, widzę moje wiersze, jednak ponieważ moja lista jest długa i zawiera ponad 200 pozycji, kiedy goto środku listy, a następnie kliknij element, a następnie powrócił pozycja jest źle (to coś jak 7, czasami 4 i itp.).
Teraz co to jest tajemnica? Jeśli aktywuję element listener listy z mojego fragmentu i kliknę wiersz, wtedy poprawna pozycja wiersza zostanie wyświetlona w tym wierszu, jeśli kliknę przycisk, wtedy wyświetlona zostanie niewłaściwa pozycja.
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.e(TAG, "item " + position + " clicked.");
}
});
Wynik w LogCat:
05-09 10:22:25.228: E/AddFriendsFragment(20296): item 109 clicked.
05-09 10:22:34.453: E/*** AddFriendsAdapter ***(20296): Item: 0
Wszelkie sugestie będą mile widziane. Dzięki
Gdzie implementujesz 'OnAddUserClicked()'? Również jeśli używasz BaseAdaptera i 'List' możesz uprościć swój adapter używając 'ArrayAdapter', ponieważ jest on w zasadzie _is a_' List' i jest zbudowany tak, aby rozwiązać dokładny problem z ładowaniem tablicy lub listy obiektów danych do AdapterView –
FoamyGuy