2012-07-30 2 views
0

FrameLayout을 사용하는 주 활동이 있습니다. 화면은 왼쪽 탐색 패널과 오른쪽 내용 패널로 나뉩니다. 왼쪽 패널은 여러 레이아웃을 함께 붙일 수있는 오른쪽 패널 (contentLayout)에 다른 레이아웃을로드하는 탐색에 사용됩니다. 왼쪽 탐색 패널에 ListViewonItemClickListener과 함께 있습니다. 각자의 onItemClick 방법, 난과 같이 자신의 레이아웃을 부풀려 다음 contentLayout.removeAllViews()를 사용 : 나는이 포함 된 ThirdClassLayout 팽창두 개의 레이아웃에서 하나의 ListView를 사용하면 두 번째 레이아웃이 업데이트되지 않습니다.

private final OnItemClickListener redListener = new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     contentLayout.removeAllViews(); 
     if (myFirstClassLayout == null) { 
      myFirstClassLayout = FirstClassLayout.getLayout(
           layoutInflater, 
           MyActivity.this, 
           resources, 
           new ArrayList<String>(), 
           new ArrayList<Desc>() 
          ); 
     } 
     CommonClass.updateListeners(); 
     if (FirstClassLayout != null) contentLayout.addView(myFirstClassLayout); 
    } 
}; 

private final OnItemClickListener blueListener = new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     contentLayout.removeAllViews(); 
     if (mySecondClassLayout== null) { 
      mySecondClassLayout = SecondClassLayout.getLayout(
           layoutInflater, 
           MyActivity.this, 
           resources, 
           new ArrayList<String>(), 
           textList, 
           new ArrayList<Desc>(), 
           hash 
          ); 
     } 
     CommonClass.updateListeners(); 
     if (SecondClassLayout != null) contentLayout.addView(mySecondClassLayout); 
    } 
}; 

FirstClassLayoutSecondClassLayout 모두에서 동적 ListView의 사용을 만드는 (의이 commonListView를 호출하자) ArrayAdapter<String>. ListViewlistChoiceIndicatorSingle 스타일보기입니다. 즉, 각 목록 항목의 오른쪽에 라디오 버튼 모양의 아이콘이 표시됩니다.

앱이 시작되면 올바른 콘텐츠 패널이 비어 있습니다. redListener 또는 blueListener을 실행하면 올바른 콘텐츠 패널에 commonListView이 표시되고 목록 항목이 선택되지 않습니다. 빨간색을 먼저 트리거 한 다음 파란색을 트리거 한 다음 commonListView에서 선택하면 변경 사항은 FirstClassLayout으로 다시 반영됩니다. 그러나 해당 FirstClassLayout에서 commonListView의 다른 항목을 선택하고 blueListenerSecondClassLayout으로 이동하면 SecondClassLayoutcommonListView에 방금 선택한 항목이 반영되지 않습니다. 대신, 제가 마지막으로 SecondClassLayout에있을 때 선택한 항목에 붙어 있습니다.

역순으로 테스트를 수행하면 마지막 청취자에 따라 마지막 청취자와 레이아웃이 두 ​​레이아웃에 대해 적절한 UI 동기화 제어를 갖게되므로이 경우가 발생합니다. 내가 방아쇠를 당기는 것은 스스로를 통제 할 수있는 것처럼 보인다. 두 청취자가 주어진 시간에 두 레이아웃 모두에서 정확히 동일한 ListView 선택한 항목을 표시 할 수 있어야합니다.

첫번째 레이아웃 마지막 레이아웃에서 commonListView의 맞추지는 CommonClass.updateListeners()을 통해 이루어진다 않는 :

adapter.clear(); 
for (String title: statusSet) adapter.add(title); 
adapter.notifyDataSetChanged(); 
commonListView.setItemChecked(positionOfItemChecked, true); 
Log.i(TAG, "position checked = " + positionOfItemChecked); 
adapter.notifyDataSetChanged(); 

을이 지난 레이아웃에 첫번째 트리거에서 작동하기 때문에, 나는이 UI를 새로 고침 문제와 관련되어야한다 그림 , 그러나 나는 좋은 해결책을 찾기 위해 모든 곳을 수색하고 모든 제안을 시도했다. Log.i 문은 트리거 된 첫 번째 또는 마지막 레이아웃에 대해 LogCat에 올바르게 인쇄되므로 코드가 제대로 실행되고 있음을 알 수 있습니다. 나는 왜 첫 번째 것이 마지막 것을 통제 할 수 없는지 이해하지 못한다.

commonListView.invalidate(); 
((BaseAdapter) commonListView.getAdapter()).notifyDataSetChanged(); 

AsyncTask 여러 다른,하지만 아무것도는 두 번째 일치하도록 첫 번째 레이아웃을 새로 고치는 작업을 것 같았다 : 나는 시도했습니다. 누구든지 그런 문제가 발생 했습니까? 누구든지이 문제를 해결하거나이 문제를 해결하는 방법을 알고 있습니까?

답변

0

2 번째로 1 위를 차지하는 원인이 무엇인지 알아 냈습니다. 전이 코드를 많이 상속 받았기 때문에 모든 부분을 잘 모릅니다. 몇몇 다른 조각들이 관련되었다. 마침내 원래 작성자가 사용자 정의 리스너를 구현하는 사용자 정의 AdapterWrapper를 사용한 코드 부분을 발견했습니다. ThirdClassLayout은 정적 ArrayAdapter가 null인지 확인하여 새 ArrayAdapter와 새 AdapterWrapper를 한 번만 만들었습니다.이 검사를 제거하면 두 레이아웃 모두에서 두 어댑터 객체가 새로 만들어 질 수있었습니다. 자체 리스너가 생성되면 두 레이아웃이 모두 응답합니다.

0

뷰를 추가 한 후 contentLayout.requestLayout()이 문제를 해결하는지 확인하십시오.

+0

같은 if 블록 안에있는 contentLayout.addView 다음에 추가했습니다. if 블록 바로 밖에서 시도해 보았습니다. 여전히 두 번째 레이아웃에서 동일한 문제가 발생하지 않습니다. – jdynamite

관련 문제