2012-01-21 2 views
4

루프에서 LayoutInflater를 사용하려고하지만이 중 한 명이 인스턴스화 될 때마다 각 인스턴스에서 2 개 이상의 TextView를 수정해야합니다. 내가 현재 가지고있는 순간에 적절하게 인스턴스화하고 원하는대로 확장 된 XML보기를 추가합니다. 그러나 결과는 첫 번째 instatiaton의 리소스 만 수정되고 따라서 여러 번 덮어 쓰게됩니다. 내 목록의안드로이드 : LayoutInflater 및 findViewById 문제가 발생했습니다.

  LayoutInflater inflater; 
      TextView eTitle; 

      for(String[] episode : episodes) { 

       //Log.d("Episodes", episode[0] + "/" + episode[2]); 
       inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       inflater.inflate(R.layout.episode_list_item, listView); 
       eTitle = (TextView) findViewById(R.id.episode_list_item_title); 

       eTitle.setText(episode[2]); 
      } 

예 출력 :

  • 04 - 에피소드 04
  • 에피소드 제목
  • 에피소드 제목
  • 에피소드 제목처럼 가정의

this :

  • 01-01
  • 02 에피소드 - 에피소드 02
  • 03 - 에피소드 03
  • 04 - 에피소드 내가 상응하는 독특한를 받고 그 메신저를 보장하기 위해해야 ​​할 일을 04

텍스트 뷰 ID가 부 풀린 레이아웃에서 나온거야?

+0

게시 한 코드가 매우 불쾌 해 보입니다. 어떤 장소에서 이것을 쓰고 있는지 (즉, 어떤 수업과 어떤 방법으로) 설명 할 수 있습니까? – aqs

+0

어 .. 특별한 건 없어요. 에피소드 클래스에 있습니다. json을 수집하기 위해 내 서버에 비동기 호출을 보내면 json을 파싱하고 제어 된 요소 집합을 ArrayList "episodes"로 저장합니다. 모든 작업은 onCreate에서 수행됩니다. 여기 나는 배열 목록의 에피소드를 통해 for'ing 해요. 다른 것들은 관련성이 없습니다. 올바른 데이터를 가져 오는 중이지만 유일한 문제는이 layoutinflater와 findViewById가 인스턴스화 된 뷰에서 올바른 리소스를 차지하지 않는 것입니다. – RedactedProfile

+0

내가 레이아웃 inflator를 사용하고있는 "listView"엘리먼트가 단지 수직 지향적 인 LinearLayout 롤이라고 설명 할 수있다. – RedactedProfile

답변

8

왜 대신 ListView를 사용하지 않습니까?

LayoutInflater inflater = inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

for(String[] episode : episodes) { 
    View view = inflater.inflate(R.layout.episode_list_item, null); 
    mTitle = (TextView) view.findViewById(R.id.episode_list_item_title); 
    mTitle.setText(episode[2]); 

listView.addView(view); 

} 
+0

이 솔루션은 완벽하게 작동합니다. ListView를 사용하지는 않았지만 방금 LinearLayout 객체 인 기존 listView 객체를 사용했지만 여전히 완벽하게 작동했습니다. 내가 몰랐던 것을 보았고, 마술 트릭은 View 뷰 = 인화 기 등입니다. 저는 뷰 객체를 할당 할 수 있는지 몰랐습니다. 뷰를 사용하여 참조하는 것을 의미하기 때문에 지금은 전체적인 의미를 갖습니다. 특별한 존재. 아름다운! 고마워! – RedactedProfile

+0

그건 저에게 효과적이었습니다 ... 제가 사용했던 코드와 거의 똑같은 코드를 사용했는데 다른 순서로 사용 된 것 같습니다. (My layout inflater와 listview는 루프 외부로 옮겨졌고, 텍스트를 listVie에 추가하기 전에 설정했습니다.) – joshhendo

1

귀하의 LinearLayout에 약간의 TextView이 있다고 가정합니다. 한 가지 점은 같은 id을 가질 수 없다는 것입니다.

myTextView1= (TextView)findViewByid(R.id.tv1);

등 : 그래서 당신은 당신의 onCreate 방법 이제

으로 모든 textViews를 초기화 tv2tv1 말, 4 TextView는 다음 각 다른 id의 줄이 있다고 가정 등등 ...

"에피소드"를받는 기능에서 이것을 시도하십시오 :

`myTextView1.setText (episodes [0]);

myTextView2.setText (episodes [1]);

자동 onCreate에서 수행되는 활동 layout 파일에 그 이미 있기 때문에 어떤 inflater를 사용할 필요가 없습니다.

+0

+1입니다. 좋은 생각이지만 제 생각에는 솔루션의 절반에 지나지 않습니다. 미안하지만, 나는 동적으로 ID를 설정하는 것이 좋다고 생각하지만, ID를 찾는 것은 과도하다. 우리는 단지 * 만들었습니다. 그래서, 우리는 그들을 가지고 있습니다, 왜 그 수색입니까? – Gangnus

0

변경 라인 라인에

inflater.inflate(R.layout.episode_list_item, listView); 
eTitle = (TextView) findViewById(R.id.episode_list_item_title); 

:

View eTitle =inflater.inflate(R.layout.episode_list_item, listView, true);의 한 줄의 구조는 단순히 결코 정말 실제로 작동
eTitle =inflater.inflate(R.layout.episode_list_item, listView, false); 
listView.addChild(eTitle); 

.

그리고 aqs가 맞습니다. (두 번째로 나는 그에게 칭찬을하고 있습니다.) id를 동적으로 생성하십시오. eTitle의 xml 레이아웃은 id가 없을 때까지 기다려야합니다.

0

저는 여러분이 팽창 된 뷰를 포착하고 새로운 컨트롤에 대한 뷰를 보는 것을 잊고 있다고 생각합니다.

View new_view = inflater.inflate(R.layout.episode_list_item, listView, false); 
eTitle = (TextView) new_view.findViewById(R.id.episode_list_item_title); 
eTitle.setText(episode[2]); 
listView.addView(new_view); 

이 내 코드가 작동 가지고 무엇을 : 나는 당신의 코드 (팽창 된 뷰에 포함 된 뷰를 찾는) 더 같이해야한다고 생각

inflater.inflate(R.layout.episode_list_item, listView); 
eTitle = (TextView) findViewById(R.id.episode_list_item_title); 

:

여기에 원래 코드의 예상대로

희망 하시겠습니까?

John