2012-01-11 2 views
0

이 문제가 며칠 동안 앉아 있었고 정말로 자신을 찾을 수없는 것 같습니다.Android : 여러 개의 ListViews 하나의 활동 - 단 하나의 그래픽을 업데이 트합니다

Android 기기 용 애플리케이션을 구축하고 있습니다. 응용 프로그램은 소프트웨어를 실행하는 PC에 소켓 연결을 사용합니다. 사용자는 PC 프로그램의 상태를 변경할 수있는 버튼과 물건을 가지고 있습니다.이 부분은 잘 작동합니다. 기본적으로 소켓을 사용하여 PC에 텍스트를 보내십시오.

또한 안드로이드 응용 프로그램이 PC의 이벤트를 처리하기를 원합니다. 이러한 이벤트는 PC 프로그램의 상태를 반영하기 위해 장치의 UI를 변경해야합니다.

내 문제를 이해하기 위해 앱의 구조를 설명하려고합니다. Basicly 응용 프로그램은 네 개의 활동이 : 시작 화면을 보여줍니다

  • 스플래시 활동을하고, 설정 시간이 다음 활동을 입력을
  • 커넥터 활동을 실행 한 후 위치를 사용자가 입력됩니다 PC의 IP. 장치가 PC에 연결되면 PC는 기본적으로 프로그램의 상태가 포함 된 xml 파일을 장치로 보냅니다. 이 XML 파일은 구문 분석되며 오류없이 구문 분석 된 경우이 활동은 다음 활동을 시작합니다.
  • 다음 활동은 분석 된 xml에 따라 1에서 5 개의 탭을 만드는 TabActivity입니다. 각 탭에는 각 탭의 내용을 처리하는 활동이 필요합니다. 여기에서는 모든 탭에 대해 하나의 활동을 사용하도록 선택했습니다.
  • 마지막 활동은 컨텐츠 활동입니다. 이것은 ListActivity입니다. xml을 구문 분석 할 때 항목은 5 개의 범주 (각 항목에 대해 하나의 탭)로 작성되고 나누어집니다. 탭을 처음 선택하면 내용이 생성되고 해당 탭에 대해 만들어진 ListView 개체가 생성됩니다. 카테고리의 각 항목에 대해 레이아웃 (xml)을 부 풀리고 객체의 상태를 기반으로 올바른 그래픽을 설정합니다. 이것은 잘 작동합니다. 탭 사이를 전환해도 좋습니다.

그래서 탭을 전환 할 때 탭의 ListView가 null인지 확인하고 그럴 경우 콘텐츠를 생성하고 그렇지 않은 경우 "setListAdapter (...)"메서드를 호출합니다. 올바른 "list.getAdapter()"를 사용하십시오. 여기서 list는 탭과 관련된 목록입니다.

PC에서 이벤트를받을 때 Handler는 이벤트를 처리합니다. 이 핸들러는 메시지를 구문 분석하고 변경할 UI의 부분과 UI의이 부분과 관련된 Object를 찾습니다. Object의 상태는 무엇인가에 따라 바뀝니다. obecjt의 탭이 현재 열려 있으면 View도 변경됩니다. 다른 뷰가 열리면 부울은 탭의 객체가 상태를 변경했음을 알립니다.

ListView 변수에서보기를 가져오고 하위 요소를 변경하려고했으나 목록이 현재 목록이 아닐 때 작동하지 않습니다.

그런 다음 탭이 눌려 질 때 탭에 대해 완전히 새로운 ListView를 만들려고했습니다.이 부울이 뭔가 변경되었다는 것을 보여주는 경우 (첫 번째 장소에서 처음 생성 된 것처럼) -이 작업은 하나의 탭.

두 개의 탭 (2와 3)으로 테스트 해 보았습니다. 응용 프로그램은 탭 1에서 시작합니다. 그런 다음 탭 2와 3을 열면 두 탭에서 PC로 명령을 보내면 모두 정상입니다. PC가 앱에 이벤트를 보내면 탭 3 만 실제로 업데이트됩니다. 탭이 활성 및 비활성 상태 일 때 (활성화 될 때 업데이트). 탭 2는 변경 사항에 대한 내용을 업데이트하지 않습니다.

탭 2 만 열고 탭 3이 아닌 경우 탭 2는 두 경우 모두 업데이트됩니다.

누구든지 여기에서 할 수있는 것에 대한 아이디어가 있습니까?

invalidate(), notifyDataSetChanged(), invalidateViews() 등 모든 종류의 항목을 시도했지만 트릭을 수행하지 않습니다.

정말 새로운 ListView (변경된 개체에서)를 만들 때 왜 이전 ListView가 표시되는지 이해할 수 없습니다.

모든 탭에 대해 하나의 활동을 사용하도록 선택할 때 나는 발에서 몸을 쏘았습니까? 아니면 다른 것입니까?

누군가 나를 도와 줄 수 있기를 바랍니다.

그리고

일부 코드는 다음 응용 프로그램으로 ~의 15 개 클래스와 코드 라인의 수천을 구성하는 부분을 알려주세요 필요하다, 그래서 모든 :) 게시하지 않을 경우

건배

+0

새로운 메시지가 브로드 캐스트 메시지가 왔을 때 ui 부분 : ui가 활성화 된 경우 (onResume) 브로드 캐스트 레코더를 등록하고 비활성화 될 때 등록을 취소 (onPause) ..... 또는 통신 내용 넣기 서비스, ​​사용자 부분 바인드 서비스 및 ui와 서비스 간의 통신을 인터페이스로 사용하십시오 (read doc : AIDL) – Selvin

+0

문제를 설명하는 데 어려움을 겪었을 수 있습니다. 내 앱이 서비스로 실행되고 있지 않습니다. 앱이 열려 있고 소프트웨어가 PC에서 실행되는 동안 PC와 연결하고 통신하는 앱입니다. 앱이 종료되면 연결이 끊어지고 더 이상 데이터를 수신하지 않아도됩니다. 정상적으로 작동합니다. 응용 프로그램이 다시 서비스에 연결되면 새 xml 파일을 받아 파싱하고 UI가 생성됩니다. 이는 다소 복잡한 프로세스이므로 프로그램이 실행되는 동안 명령은 객체, 변경된 객체의 상태 및 새 상태를 식별하는 텍스트 일뿐입니다. – Knirkegaard

+0

왜 내가 당신이 서비스를 사용해야한다고 생각하는지 ... 서비스는 언더 레이 객체를 계속 유지해야한다고 생각합니다. fx .: ArrayAdpater의 배열 ... PC의 데이터를 반복한다면이 배열에 추가하고 UI에 브로드 캐스트를 지정하십시오. " 새 배열, 새로 고침 "... 만약 당신이 현재 탭 (IIUYC, 당신은 오히려 어댑터를 변경, 각 탭에 대한 ListView가 안) 서비스를 요청할 수 있습니다 ("안녕 서비스, geme 탭 nr X에 대한 최신 배열 "바인딩) 또는 다른 브로드 캐스트 (서비스)를 보내어 배열로 응답 할 수있는 서비스로 UI (Ui)에서 브로드 캐스트를 전송하여 ... heh 생각해 봅시다. – Selvin

답변

0

I 첫 번째 접근 방식 대신에 각각의 탭 컨텐트에 대해 하나의 활동으로 끝나고 탭을 눌렀을 때 목록 뷰의 어댑터 간을 전환했습니다.

각 탭에 대한 활동으로 분할하여 활동이 표시되는지 여부에 관계없이 모든 내용을 변경할 수 있습니다.

관련 문제