2012-03-10 2 views
3

해결책을 찾았습니다!Android : 팽창 레이아웃이 오래 걸린다

이제 ViewFlipper 대신 ViewPager를 사용합니다. 뷰는 이제 run() 메소드 (웹에서 데이터를 가져와 이미 있기 때문에) 내에 생성되고 Map에 저장됩니다. 내 Handler에서 pagerAdapter.notifyDataSetChanged()를 호출하면 pagerAdapter가 뷰의 Map을 사용하고 원활하고 빠르게 작동합니다. 이제 ViewPager 스크롤을 끝없이 볼 수있는 거리를 찾고 있지만 다른 문제는이 문제와 관련이 없습니다.)

답장을 보내 주시면 감사하겠습니다.

(거대한) 레이아웃을 부 풀릴 때 나는 안드로이드 개발과 새로운 문제에 직면 해있다. 잘 작동하는 Webservice에서 일부 데이터를 가져오고이 데이터를 프론트 엔드로 가져 오기 위해 내 Activity 내에서 핸들러를 사용하고 있습니다. 여기 내 handleMessage은 다음과 같습니다

public void handleMessage(Message msg) { 
     LayoutInflater inflater = getLayoutInflater(); 

     List<Integer> gamedays = new ArrayList<Integer>(games.keySet()); 
     Collections.sort(gamedays); 

     for (Integer gameday : gamedays) { 

      View gamedaytable = inflater.inflate(R.layout.gamedaytable, null); 
      TableLayout table = (TableLayout) gamedaytable.findViewById(R.id.gameDayTable); 
      table.removeAllViews(); 
      List<Game> gamelist = games.get(gameday); 
      int rowcount = 2; 
      for (Game game : gamelist) { 

       View tableRow = inflater.inflate(R.layout.gamedayrow, null); 

       TextView homeTeam = (TextView) tableRow.findViewById(R.id.gameDayHome); 
       TextView awayTeam = (TextView) tableRow.findViewById(R.id.gameDayAway); 
       TextView gameResult = (TextView) tableRow.findViewById(R.id.gameDayResult); 
       gameResult.setBackgroundResource(R.drawable.resultbackground); 
       homeTeam.setText(game.getHomeTeam().getName()); 
       awayTeam.setText(game.getAwayTeam().getName()); 
       if (game.getHomegoals() < 0 || game.getAwaygoals() < 0) { 
        gameResult.setText("-:-"); 
       } else { 
        gameResult.setText(game.getHomegoals() + ":" + game.getAwaygoals()); 
       } 

       if (rowcount % 2 == 0) { 
        tableRow.setBackgroundColor(0xffdee0dd); 

       } else { 
        // setting alternative background 
        tableRow.setBackgroundColor(0xfff1f3f0); 
       } 
       rowcount++; 

       table.addView(tableRow); 
      } 
      flipper.addView(gamedaytable); 
     } 
     flipper.setDisplayedChild(thisgameday - 1); 
     pd.dismiss(); 

    } 

내 문제는이 코드가 매우 느리게 실행이 사라지고 레이아웃이 표시되기 전에 processdialog이 약 1 초 동안 정지 거라고이다. 게임은 자체적으로 9 개의 항목을 포함하는 34 개의 항목으로 구성됩니다. 그래서 34 테이블을 구성하는 relativeLayout()으로 구성된 테이블을 추가합니다. 문제는 안드로이드가 그리기 시작하고 레이아웃을 계산하기 시작하는데 너무 오래 걸린다 고 생각합니다. 내가 올바른지 AsynTask를 사용할 수 없다. 내가 UI 스터프를 할 수없고 UI 스터프 만하고 있기 때문이다.

이렇게하는 동안 프로세스 대화 상자가 멈추지 않는 방법을 찾고 있습니다. 아니면 내가 뭘 일부 completly 잘못된

R.layout.gamedaytable :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/relativeLayout1" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#fff1f3f0" 
android:focusableInTouchMode="false" > 

<TableLayout 
    android:id="@+id/gameDayTable" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:focusableInTouchMode="false" > 
</TableLayout> 

</RelativeLayout> 

R.layout.gamedayrow :

<TableRow xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/tableRow1" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:focusableInTouchMode="false" 
android:paddingBottom="5dp" 
android:paddingTop="5dp" > 

<TextView 
    android:id="@+id/gameDayHome" 
    style="@style/textsizeSmallScreen" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="5dp" 
    android:text="Mannschaft 1" /> 

<TextView 
    android:id="@+id/textView2" 
    style="@style/textsizeSmallScreen" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp" 
    android:text=":" /> 

<TextView 
    android:id="@+id/gameDayAway" 
    style="@style/textsizeSmallScreen" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Mannschaft 2" /> 

<TextView 
    android:id="@+id/gameDayResult" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="5dp" 
    android:background="@drawable/resultbackground" 
    android:paddingLeft="10dip" 
    android:text="0:5" 
    android:textColor="#FFFFFF" 
    android:textSize="11dp" 
    android:textStyle="bold" 
    android:typeface="monospace" /> 

</TableRow> 

추가 정보 : 이 어떻게 표해야이다 봐. 당신은 확실히 AsyncTask에서이 작업을 수행 할 수 있습니다

table

답변

0

)이 정말 나 때문에 그 tabledata에 대한 ListView를해야하는 경우 그래서 나는 확실하지 않다. AsyncTask의 doInBackground 메서드에서 UI를 업데이트 할 수는 없지만 onProgressUpdate에서 할 수 있습니다. 당신이 항목을 통해 반복되는 있도록 onProgressUpdate에 콜백을 얻을 때, 아이템의 UI 업데이트를 각 항목에 대해 publishProgress를 호출 한 다음 할 doInBackground에있는 동안

나는 코드를 깰 것이다.

+0

내 코드가 UI 업데이트 (보기 가져 오기 제외)로만 구성되어 있기 때문에 문제가 해결되지 않을 것이라고 생각합니다. 또는 doInBackground에서 레이아웃을 확장하고 publishProgress에서 flipper.addView를 수행 할 수 있습니까? – amfa

+0

그들을 doInBackground에 팽창 시키면 작동 할 수 있습니다. 참조하십시오 : http://stackoverflow.com/questions/6691311/inflate-a-view-in-a-background-thread/6692007#6692007 – elevine

+0

그러나 thethread에 따르면 나는 부작용이있을 수 있기 때문에 나는 이것을해서는 안됩니다. 어쩌면 나는 완전히 다른 솔루션을 사용해야한다. 왜냐하면 창조물이 작동해도 .. viewflipper 자체가 어떻게 든 매우 느리고 "App Feeling"이 없다.) 어쨌든 당신의 도움을 주셔서 감사합니다. – amfa

4

목록을 작성하는 것처럼 보일 것입니다. ListView를 사용하면 현재 표시되는 행 수만큼의 UI를 작성해야 할 필요가 있고, 사용하면 많은 행을 부 풀릴 필요가 없습니다.

+0

그것은 모든 행이 항상 표시된다고 생각하지 않습니다. 그리고 지금은 평범한 목록처럼 보일지 모르지만 나는 그들이 경기되는 날까지 축구 경기 결과 인 항목을 그룹화하여 테이블 /리스트를 확장 할 계획입니다 (금요일과 금요일 사이에 하루가 될 수 있음) . ListView가 올바른 솔루션인지 확실하지 않습니다. – amfa

+0

ListView 나 ExpandableListView와 같은 소리가 계속 들립니다. – superfell

+0

나는 그것을 시도 할 것이다 지금까지 도움을위한 감사합니다. – amfa

1

Listview를 방문하는 것이 좋습니다. 심지어 우리는 최적화 된 방식으로리스트 뷰에 하나 이상의 행 디자인을 추가 할 수 있습니다. 그러면 성능이 향상됩니다.

+0

나는 ListView를 아직 시도하지 않았다. (내게 수치 스럽다.)하지만 테이블에서 배열하는 것과 같은 방식으로 목록을 정렬하는 방법은 무엇일까요? 그리고 textViews에 고정 폭을주지 않고? 예. ":"가있는 textView2는 모든 항목에서 동일한 "열"이어야합니다. – amfa

+0

Horizonatal 방향을 사용하여 LinearLayout에 하위보기를 추가 할 수 있습니다. 합계 가중치를 4로 추가하고 모든 하위 레이아웃의 가중치를 1로 유지하십시오. 부모의 너비를 0으로 유지하지 않으려면 (전체 화면을 차지할 것이라고 말하는 최적의 방법). – Pavandroid

2

해결책을 찾았습니다!

이제 ViewFlipper 대신 ViewPager를 사용합니다. 뷰는 이제 run() 메서드 (웹에서 데이터를 가져와 이미 거기에 있음) 내에서 생성되고 Map에 저장됩니다. 내 Handler에서는 pagerAdapter.notifyDataSetChanged() 만 호출합니다. pagerAdapter는 뷰의 Map을 사용하기 때문에 부드럽고 빠르게 작동합니다. 그래서 지금은 ViewPager 스크롤을 끝없이 볼 수있는 거리를 찾고 있습니다. 그러나이 문제와 관련없는 또 다른 문제가 있습니다.)

답장을 보내 주시면 감사하겠습니다.

관련 문제