에 나는 내 응용 프로그램에서 다음과 같은 구조를 가지고있다. ListView
의 각 요소는 LinearLayout
이고 두 개의 숫자는 TextViews
이고 Button
입니다. LinearLayout
과 버튼은 onClickListeners
(별도)입니다. LinearLayout
을 클릭하면 다른 Activity
이 시작됩니다. 클릭 동작이 매우 일치하지 않는 것으로 나타났습니다. 즉, 액션이 즉시 실행되지만 매우 자주 지연되고 가끔 몇 번 탭해도 무시됩니다. 내가 탭할 수 있기 때문에 더 이상해질 수 없으며 목록을 스크롤하기 시작할 때만 작업이 실행됩니다. 내가 setFocusable(false)
과 setSelectable(true)
의 다양한 조합을 시도했지만 어떤 차이도없는 것 같습니다. 어떤 아이디어? 자세한 내용을 기꺼이 알려 드리겠습니다.안드로이드 지연 클릭은 ListView에
답변
아무도 내가 이것을 어떻게 해결했는지 궁금 할 때가 있습니다. 기본적으로 레이아웃을 단순화해야했습니다. 복잡한 중첩 구조가있을 때 이벤트가 너무 오래 걸려 버블 링 될 수 있으며 동시에 스크롤 목록을 시작하면 이벤트가 잘못된 동작을 트리거 할 수 있습니다. 가능한 한 많이 RelativeLayout으로 전환하여 레이아웃을 다듬 었습니다. 많은 도움이 된 것처럼 보입니다.
이벤트 스레드에서 일부 차단 프로세스 (예 : webservices 호출 또는 파일 열기)가 실행되어 이벤트 스레드가 차단 된 것 같습니다. 이 경우 차단 코드를 이벤트 THread 이외의 다른 스레드로 처리하십시오.
동일한 문제가 발생했지만 제 경우에는 솔루션이보기에 대한 참조를 유지하지 않아서 ListView의보기에 문제가 발생했습니다. 캐싱. converview를 사용하여 getView()
메소드를 올바르게 구현 한 후에는 손실/예기치 않은 클릭 호출로 인한 이상한 동작이 사라졌습니다.
나를 위해 일한 것은 OnItemClickListener
을 ListView
에서 setOnItemClickListener
까지 할당하는 것이지 개별 목록 항목에 OnClickListener
을 할당하는 것이 아닙니다. 당연히 버튼에는 자체적으로 OnClickListener
이 필요하지만이 시나리오는 테스트하지 않았습니다.
비슷한 문제가있어서 디버깅하고 해결하는 데 2 일이 걸렸습니다. 모든 목록 항목에 대해 LinearLayout에 여러 TextView를 만드는 ListAdapter가 있습니다. 각 항목의 클릭을 처리해야하므로 각 TextView에는 고유 한 OnClickListener가 있습니다.
뷰를 다시 사용하도록 구현을 변경했을 때 OnClickListener가 올바르게 작동하지 않았습니다. 4.4.2에서 대부분의 클릭이 작동했지만 때로는 목록에서 스크롤 할 때까지 아무런 반응이 없었습니다. 2.3에서는 첫 번째 클릭이 작동하지 않고 모든 클릭이 한꺼번에 처리됩니다.
내 특별한 경우에는 리소스를 부 풀리지 않고 자바 코드로 모든 뷰를 만들었습니다. 그리고 중요한 점은 뷰를 재사용 할 때도 LinearLayout의 LayoutParams를 설정했다는 것입니다.이 뷰는 재사용 된 뷰에 올바른 레이아웃 매개 변수가 있다고 가정 할 때 더 안전합니다. 모든 것을 재사용 할 때 LayoutParams를 설정하지 않으면 잘 작동합니다!
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout tapeLine = null;
if (convertView != null && convertView instanceof LinearLayout && ((LinearLayout)convertView).getChildCount() == 4) tapeLine = (LinearLayout) convertView; // Reuse view
else tapeLine = new LinearLayout(activity);
if (convertView == null) { // Don't set LayoutParams when reusing view
ViewGroup.LayoutParams tapeLineLayoutParams = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
tapeLine.setLayoutParams(tapeLineLayoutParams);
}
ScrollingTape scrollingTape = calculatorHolder.getCalculator().getScrollingTape();
int tapeWidthPx = parent.getWidth();
TapeLineTextSizeInfo tapeLineTextSizeInfo = calculatorHolder.getTapeLineTextSizeHelper().createTapeLineTextSizeInfo(tapeWidthPx);
ScrollingTapeLine line = scrollingTape.getLine(position);
tapeLine.setOrientation(LinearLayout.HORIZONTAL);
int tapeBackgroundColor = getBackgroundColor(line);
tapeLine.setBackgroundColor(tapeBackgroundColor);
addColumnViews(tapeLine, line, tapeLineTextSizeInfo);
tapeLine.setTag(R.id.scrollingtapeadapter_viewtag_position, position);
tapeLine.setOnLongClickListener(longClickListener);
tapeLine.setOnClickListener(remainClickListener);
return tapeLine;
}
목록보기의 이상한 행동의 배경은 무엇인가 : 여기서 중요한 코드? 나는 안드로이드 소스에서 약간의 디버깅과 연구를했다. 안드로이드가 뷰를 업데이트 할 때 onMeasure와 onLayout이라는 두 가지 중요한 단계가 있습니다. ListAdapter의 getView 메소드는 뷰를 그리기 위해 호출 될뿐만 아니라 onMeasure 중에도 호출됩니다. 나중에이 경우보기가 생성되지만 아직 이벤트를 처리하기 위해 이벤트 체인에 등록되지 않았습니다.
onMeasure 용으로 만든보기를 나중에 다시 화면에 그려야 할 때는 Android 시스템에서 등록해야 클릭 이벤트를 처리 할 수 있습니다. 이 특별한 경우 Android develepers는 더러운 해킹으로 간주 될 수있는 무언가를했습니다. LayoutParams의 특별한 플래그는 이벤트 변경에 뷰를 등록해야하는지 결정하는 데 사용됩니다.
내 문제 :보기를 다시 사용할 때 LayoutParams를 다시 설정하면이 플래그가 항상 재설정됩니다. 따라서 안드로이드 시스템은 뷰를 등록하지 않고 이벤트가 전달되지 않습니다.
요약하면 : ListAdapter의 getView에서보기를 다시 사용하면 안드로이드 시스템의 내부 정보를 유지하기 때문에 LayoutParams를 덮어 쓰지 않습니다.
동일한 문제가있었습니다. 내 경우 레이아웃은 목록의 데이터 소스를 기반으로 크기를 조정해야하므로 처음으로 뷰가 부풀려지면서 layout.params가 변경되고 행 항목에 대한 클릭이 다시 제대로 작동했습니다. –
OM * G, 안돼, 그게 내 것이 었어! 그게 바로 뒤로, 애매하고 완전히 뇌사 상태입니다. API는 계약이며이 계약은 준수되지 않습니다. 이 시간을 잃어 버렸습니다. Google 개발자가 내 근처에 있도록 두지 마십시오. 이 일에 열중하게 해줘서 고맙다. –
이 방법으로 누구에게 도움이되는지 확신 할 수 없지만 대신 TableLayout과 비슷한 문제가 있습니다. 위의 해결 방법으로 내 문제가 해결되지 않았습니다.
는 나에게 문제가 있었다 :android:animateLayoutChanges="true"
이 제대로 작동하려면 내 TableLayout을 행 내 내 버튼 클릭을 허용십시오. 위의 속성에 의존하는 대신 수동으로 내보기에 애니메이션을 적용해야했습니다.
비활성화 애니메이션도 저에게 효과적이었습니다. –
- 1. 안드로이드 ListView에
- 2. 안드로이드 ListView에 - 부모의 ListView
- 3. 안드로이드 정렬 ListView에
- 4. 내 안드로이드 프로그램에서 ListView에
- 5. 안드로이드 ListView에 선택기 색상
- 6. 핸들 클릭은
- 7. 안드로이드 ListView에 OnItemClick보기 변경 등록
- 8. 안드로이드 ListView에 항목 하이라이트 프로그램
- 9. 안드로이드 - 가장 좋은 방법은 ListView에
- 10. 처리기를 사용한 안드로이드 지연
- 11. 안드로이드 sqlite가 지연
- 12. 안드로이드 : 나는 테이블과의 ListView에 SQLite는의 내용을 표시하려면이 방법을 사용하고 ListView에
- 13. 클릭은 셀레늄에 DIV를 생성
- 14. 스크롤 텍스트 뷰 - 클릭은
- 15. 안드로이드 지연 목록로드 및 클릭
- 16. 안드로이드 - ListView에 HeaderView를 추가하면 ClassCastException이 throw됩니다.
- 17. 이미지를 포함하는 ListView에 안드로이드 전달 이미지
- 18. 안드로이드 : 텍스트 뷰 헤더 문제와 ListView에
- 19. 안드로이드 - 프로그래밍 방식으로 ListView에 버튼 추가
- 20. 안드로이드 - ListView에 DB에서 커서 결과 표시
- 21. 안드로이드 : 빈 listView에 데이터를 추가하는 방법
- 22. 안드로이드 - 어떻게 ListView에 URL에서 이미지를 표시하려면?
- 23. 체크 박스와 안드로이드 ListView에 모든 클릭
- 24. ListView에
- 25. ListView에
- 26. 안드로이드 이클립스 플러그인 유형에 지연 (3.6 - 헬리오스)
- 27. 안드로이드 MediaPlayer를 지연 표면 무승부 동기화
- 28. 메모 전에 안드로이드 - 미디 lib 지연
- 29. 데이터베이스로 보낼 때 안드로이드 GPS 지연
- 30. listview에 많은 항목을로드하려면 어떻게해야합니까?
저는 모든 백그라운드 프로세스를 수행하기 위해 특별히 AsyncLoader를 사용합니다. 그러나 팁을 주셔서 코드를 재평가 해 보겠습니다! – Bostone
결국 이유가 아니 었습니다. 내 대답을 참조하십시오 – Bostone