2014-11-06 4 views
1

У меня есть 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) { 

    } 
}); 
+1

у это возвращение options.size() - 1 ; –

+0

Потому что я не хочу, чтобы выбранная в данный момент опция отображалась в списке. – pbevis

ответ

0

попробовать это

dropdownListView.setOnItemClickListener(new OnItemClickListener() { 
@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    Log.d("dropdown", "itemClicked at index " + position); 
    selectOption(position); 
    handleEventSelectionRowClicked(); 
} 
}); 

его работы для меня я не использую new AdapterView.OnItemClickListener()

это мой код

lvs.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, 
       int position, long id) { 
      // TODO Auto-generated method stub 
      TextView names = (TextView) arg1.findViewById(R.id.from); 
      TextView emails = (TextView) arg1.findViewById(R.id.date); 

     } 
    }); 
+0

Что значит? Его тот же код –

+0

@raj: если u r не использует 'AdapterView.OnItemClickListener', то что вы используете, используя проверку ur import' OnItemClickListener' – kId

+0

@raj: Извините, я немного смущен относительно того, что вы пытаетесь сказать здесь. Это похоже на то же самое ... – pbevis

Смежные вопросы