멋진 Baseball을 사용하지 않는 사용자 정의 BaseAdaptor가있는 ListView가 있습니다. 각 행에 표시 할 올바른 문자열을 선택하기 만하면됩니다.ListView onItemClickListener가 애니메이션 이후에 잘못된 위치를 반환합니다.
제 문제는 ListView에 연결된 onItemClickListener가 잘못된 인덱스를 선택/반환하고있는 것 같습니다. 더 구체적으로 말하면 실제로 누를려고하는 행 아래의 색인을 선택하는 것입니다.
그래서 첫 번째 행을 시도 할 때 두 번째 행이 강조 표시되고 onItemClickListener가 0과 반대로 위치 1을 반환한다는 것을 알 수 있습니다. 마찬가지로 두 번째 행을 시도하면 세 번째 행은 흥미롭게도 ListView 바로 위에있는 영역을 탭하면 첫 번째 행이 강조 표시됩니다. ListView가 다른 배경색을 설정하여 명확하게 보이지 않더라도 강조 표시됩니다.
그러나 내가하고있는 한 가지 이상한 점은 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를 초기화하는거야 방법은 다음과 같습니다 : 여기
내 애니메이션 코드입니다 BaseAdapter 여기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();
}
});
그리고입니다 :
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;
}
}
을 편집
그것은 애니메이션 문제였습니다. 나는 여전히 원래의 코드가 작동하지 않는 이유를 아직도 이해하지 못하고 있지만 프레임을 다시 설정하고 애니메이션 작업을 지우는 청취자를 추가하는 것으로 나타났습니다.
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) {
}
});
이다 Y이 반환 options.size() - 1 ; –
현재 선택된 옵션이 목록에 나타나지 않기 때문에. – pbevis