2014-11-06 6 views
1

멋진 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) { 

    } 
}); 
+1

이다 Y이 반환 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 : 만약 당신이'AdapterView.OnItemClickListener'를 사용하지 않고 무엇을 사용한다면'OnItemClickListener'의 check ur import를 사용하십시오. – kId

+0

@raj : 죄송합니다. 당신이 여기서 말하고자하는 것에 대해 조금 혼란 스럽습니다. 똑같은데 ... – pbevis

관련 문제