2010-01-22 5 views
10

getChildCount()은 행이 모두 ListView's이 아니기 때문에 아래 코드는 모든 ListView's 행의 텍스트를 변경하지 않지만 표시되는 행만 변경합니다.안드로이드 ListView에서 보이는 자식뿐만 아니라 모든 자식 뷰를 반복/조작 할 수 있습니까?

for (int i = 0; i < listView.getChildCount(); i++) 
{ 
    View v = listView.getChildAt(i); 
    TextView tx = (TextView) v.findViewById(R.id.mytext); 
    tx.setTextSize(newTextSize); 
} 

그래서 내가 뭘해야합니까?

ListView's 행이 표시 될 때 알림을 받기위한 코드가 있습니까? 그렇다면 텍스트 크기를 설정할 수 있습니까?

+0

어댑터의 텍스트 크기 또는 'ListActivity'를 저장하고 어댑터의 getView 메소드에서 텍스트 크기를 설정하십시오. –

답변

9

List13 데모는 OnScrollStateChanged를 사용하여 비슷한 기능을 수행합니다. 그래도 더 좋은 방법이있을 수 있습니다.

public void onScrollStateChanged(AbsListView view, int scrollState) { 
    switch (scrollState) { 
    case OnScrollListener.SCROLL_STATE_IDLE: 
     mBusy = false; 

     int first = view.getFirstVisiblePosition(); 
     int count = view.getChildCount(); 
     for (int i=0; i<count; i++) { 
      TextView t = (TextView)view.getChildAt(i); 
      if (t.getTag() != null) { 
       t.setText(mStrings[first + i]); 
       t.setTag(null); 
      } 
     } 

     mStatus.setText("Idle"); 
     break; 

. . . 코리 Trager BY

편집 :

위는 확실히 올바른 방향으로 절 지적했다. OnScrollListener.onScroll 처리가 onScrollStateChanged보다 효과적이라는 것을 발견했습니다. onScrollSgtaetChanged에서 case 문을 제거하고 모든 상태 변경을 처리하더라도 일부 텍스트 크기가 조정되지 않았습니다. 그러나 onScroll을 사용하면 모든 것이 작동하는 것 같습니다.

그래서, 내 보이는 작업 코드는 다음과 같습니다 ListView가에서

public void onScroll(AbsListView v, int firstVisibleItem, int visibleCount, int totalItemCount) 
{ 
    ListView lv = this.getListView(); 
    int childCount = lv.getChildCount(); 

    for (int i = 0; i < childCount; i++) 
    { 
     View v = lv.getChildAt(i); 
     TextView tx = (TextView) v.findViewById(R.id.mytext); 
     tx.setTextSize(textSize); 
    } 
} 
+2

아마도이 방법이 효과적 일지는 모르겠지만 매우 비용이 많이 듭니다. 당신은 스크롤 이벤트마다 똑같은 작업을하고 있습니다. 많은 항목을받을 수 있습니다 (새로운 항목이 보이기 만하면 될 필요는 없습니다). –

+1

@Romain - "비용이 많이 드는"것은 사용자 자신이 할 수있는 효과가있는 경우에만 중요합니다. 만나다. 그리고 그렇지 않습니다. 컴퓨터는 귀하가 신용을 부여하는 것보다 빠르며 어렵지 않게 사용합니다. 이봐 요, 보이는 스트로크를 연장하여 모든 마우스 움직임 이벤트에 반응하는 페인트 프로그램을 생각해보십시오. –

+2

아니요. 우리는 휴대 전화를 다루고 * 모든 것은 * 당신이 * 배터리 * 비용을들입니다. 게으른 프로그래머와 배터리를 낭비하는 것은 절대적으로 이유가 없습니다. Android가 휴대 전화에서 사용 가능한 이유는 성능과 배터리 수명에 대해 많은 시간을 소비하기 때문입니다. 우리는 아직도해야 할 일이 많지만 당신의 견해에는 틀림없는 결함이 있습니다. 성능에 대해 걱정할 필요가없는 상황이 있습니다 (예 : 버튼 클릭). 그러나 스크롤되는 모든 픽셀에 대해 수행하는 작업은 단지 어리석은 행동입니다. –

15

유일한 아이들이 눈에 보이는 것들입니다. "모든 아이들"을 가지고 뭔가를하고 싶다면 어댑터에서 해보십시오. 그것은 최고의 장소입니다.

+0

"모든 하위 항목"은 TextViews를 의미합니다. 글꼴 크기가 바뀌고 있습니다. 어댑터의 TextViews 자식 또는 listview 자체의 자식입니까? –

+0

그들은 ListView의 자식입니다. –

+0

이것이 올바른 답변입니다. 내 사용자 지정 어댑터에서 getView를 재정의하고 항목 당 필요한 작업을 수행하도록 선택했습니다. 또한 onClick 이벤트에서 텍스트 변경을 트리거하는 경우 목록보기에서 invalidateViews()를 호출하십시오. 멋지게 작동합니다! Romain에게 감사드립니다! – bgs

0

performace 효과에 대해서는 잘 모르겠지만 시도해 볼 수 있습니다.

//declare the list 
ListView list = (ListView)findViewById(R.id.yourListID); 

// in my case i have spinners and made a test just to know if this works 
Spinner spnWhatever; 
View view; 
int i =0; 


     do{ 

      view =list.getAdapter().getView(i,null,null); 
      //get the spinners from each row 
      spnWhatever =(Spinner)view.findViewById(R.id.spnTarifas); 

     i++; 

     }while(list.getAdapter().getCount() !=i);