У меня есть ListView с пользовательским BaseAdaptor, который не делает ничего необычного, просто выбирает правильную строку для отображения в каждой строке.ListView onItemClickListener возвращает неправильную позицию после анимации
Моя проблема заключается в том, что мой onItemClickListener, который подключен к ListView, кажется, выбирает/возвращает неверный индекс. Более конкретно, он выбирает индекс ниже строки, которая на самом деле пытается быть нажатой.
Так что, когда я пытаюсь нажать первую строку, я вижу, что вторая строка подсвечена, а onItemClickListener возвращает позицию 1 в противоположность 0. Аналогично, когда я пытаюсь нажать вторую строку, подчеркнуто и т. д. Интересно, что когда я пытаюсь использовать область чуть выше ListView, выделяется 1-я строка, хотя ListView явно не простирается выше, что я вижу, устанавливая другой цвет фона.
Одна странная вещь, которую я делаю, однако, анимирует этот списокView вверх и вниз за другим видом в FrameLayout. Кажется, это связано с проблемой, как будто я отображаю ListView прямо на экране, все краны, похоже, правильно регистрируются. Как только я его оживлю, краны не регистрируются правильно.
Вот мой код анимации:
Boolean shouldOpen = !isDropdownShowing;
RelativeLayout selectionView = (RelativeLayout) findViewById(R.id.selectedView); //The view that the list is being animated behind
int listHeight = dropdownListView.getHeight();
int heightOfSelectionView = selectionView.getHeight();
TranslateAnimation translateAnimation;
if (shouldOpen) {
translateAnimation = new TranslateAnimation (0.0f, 0.0f, heightOfSelectionView - listHeight, heightOfSelectionView);
dropdownListView.setY(heightOfSelectionView);
} else {
translateAnimation = new TranslateAnimation (0.0f, 0.0f, heightOfSelectionView, heightOfSelectionView - listHeight);
dropdownListView.setY(heightOfSelectionView - listHeight);
}
translateAnimation.setFillAfter(true);
translateAnimation.setDuration(300L);
translateAnimation.setRepeatCount(0);
dropdownListView.startAnimation(translateAnimation);
На всякий случай вот как я это инициализацией ListView:
dropdownListView = new ListView(getContext());
dropdownListView.setAdapter(new EventsSpinnerAdapter(getContext(), options));
dropdownListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("dropdown", "itemClicked at index " + position);
selectOption(position);
handleEventSelectionRowClicked();
}
});
А вот BaseAdapter:
private class EventsSpinnerAdapter extends BaseAdapter {
LayoutInflater inflater;
List<String> options;
int selectedIndex;
public EventsSpinnerAdapter(Context context, List data)
{
inflater = ((Activity) context).getLayoutInflater();
options = data;
selectedIndex = 0;
}
@Override
public int getCount()
{
return options.size()-1;
}
@Override
public Object getItem(int position)
{
return options.get(position);
}
@Override
public long getItemId(int position)
{
if (position >= selectedIndex) {
return position+1;
} else {
return position;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = inflater.inflate(R.layout.listitem, null);
}
((TextView)convertView).setText(options.get((int) getItemId(position)));
return convertView;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = inflater.inflate(R.layout.listitem, null);
}
((TextView)convertView).setText(options.get((int) getItemId(position)));
return convertView;
}
}
EDIT
Оказывается, это была проблема с анимацией. Я до сих пор не совсем понимаю, почему мой исходный код не работал, но я обнаружил, что добавление слушателя, который снова устанавливает кадр и очищает анимацию.
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (shouldOpen) {
isDropdownShowing = true;
dropdownListView.setY(heightOfSelectionView);
} else {
isDropdownShowing = false;
dropdownListView.setY(heightOfSelectionView - listHeight);
}
dropdownListView.clearAnimation();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
у это возвращение options.size() - 1 ; –
Потому что я не хочу, чтобы выбранная в данный момент опция отображалась в списке. – pbevis