2014-12-31 11 views
0

Android의 listview 및 expandablelistview는보기를 재활용합니다. 더 많은 정보 : The nuance of android listview. 의 getView는 목록보기의 유일한 방법 인 반면다른 하위 레이아웃을 사용하여 Expandablelistview에서 재활용을 처리하는 방법은 무엇입니까?

나는 그런 것을 처리하지만 그들은뿐만 아니라 Expandablelistview에 목록보기 만 예를 제공하는 방법에 대한 위의 링크로 기사와 정보를 읽었습니다 (expandablelistview에서 getGroupView이있는 동안 및 getChildView).

내 확장 가능한 listview의 하위 노드는 응용 프로그램의 출력을 달성하는 데 필요하므로 다른 레이아웃이 필요합니다.

지금, 내 질문은 올바르게 자식의 다른 레이아웃을 부 풀릴 수있는 확장 가능한 목록보기의 재활용을 어떻게 처리 할 수 ​​있습니까? 예 : viewHolder 또는 convertable 내 expandablelistview의 getChildView 메소드에 넣으십시오.

아래의 코드를 따르면 site에서 위치에 따라 다른 레이아웃을 부 풀릴 수 있습니다.

다른 그룹을 클릭 할 때마다. 이전 그룹의 하위 뷰는 기본값으로보기를 재활용하므로 스피너와 텍스트 값 편집이 유지되지 않습니다. 나는 그것이 아마 다시보기를 부풀게하기 때문에 그것의 아마 생각한다?

다음은 내 getChildView 방법 :

@Override 
    public View getChildView(int groupPosition, int childPosition, 
      boolean isLastChild, View convertView, ViewGroup parent) { 

      //layoutInflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE); 
      //convertView = layoutInflater.inflate(R.layout.expandable_child_layout, parent, false); 
     try{ 
      int itemType = getChildType(groupPosition, childPosition); 

      switch(itemType){ 
      case 0: 
       ViewHolder mainHolder = null; 
       View v1 = null; 
       if(v1 == null){ 

        mainHolder = new ViewHolder(); 
        v1 = View.inflate(context, R.layout.newtrip_main, null); 
        v1.setTag(mainHolder); 

        mainHolder.tripType = (Spinner) v1.findViewById(R.id.spinTripType); 

        /*TripTypeAdapter = new ArrayAdapter<String>(NewTrip.this, android.R.layout.simple_spinner_item,getResources().getStringArray(R.array.triptypes)); //selected item will look like a spinner set from XML 
        TripTypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
        tripType.setAdapter(TripTypeAdapter);*/ 
        mainHolder.tripType.setOnItemSelectedListener(this); 

       }//else{ 
        //mainHolder = (ViewHolder) v1.getTag(); 
       //} 
       return v1; 
       //break; 
      case 1: 

       ViewHolder budgetHolder = null; 
       View v2 = null; 
       if(v2 == null){ 

        budgetHolder = new ViewHolder(); 
        v2 = View.inflate(context, R.layout.newtrip_budget, null); 
        v2.setTag(budgetHolder); 

        budgetHolder.budget = (Spinner) v2.findViewById(R.id.spinBudget); 
        budgetHolder.budgetAdapter = new ArrayAdapter<String>(NewTrip.this, android.R.layout.simple_spinner_item,getResources().getStringArray(R.array.budgettype)); //selected item will look like a spinner set from XML 
        budgetHolder.budgetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
        budgetHolder.budget.setAdapter(budgetHolder.budgetAdapter); 
        budgetHolder.budget.setOnItemSelectedListener(this); 

       } 

       return v2; 
       //break; 
      case 2: 

       ViewHolder foodHolder= null; 
       View v3 = null; 
       if(v3 == null){ 
        foodHolder = new ViewHolder(); 
        v3 = View.inflate(context, R.layout.newtrip_food, null); 
        v3.setTag(foodHolder); 
       } 
       return v3; 
       //break; 
      case 3: 

       ViewHolder accomHolder= null; 
       View v4 = null; 
       if(v4 == null){ 
        accomHolder = new ViewHolder(); 
        v4 = View.inflate(context, R.layout.newtrip_accommodation, null); 
        v4.setTag(accomHolder); 

        accomHolder.accommodation = (Spinner) v4.findViewById(R.id.spinAccommodation); 

        accomHolder.accommodationAdapter = new ArrayAdapter<String>(NewTrip.this, android.R.layout.simple_spinner_item,getResources().getStringArray(R.array.economicalAccomodation)); //selected item will look like a spinner set from XML 
        accomHolder.accommodationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
        accomHolder.accommodation.setAdapter(accomHolder.accommodationAdapter); 
        //return convertView; 
       } 

       return v4; 
       //break; 

      } 
     }catch(Exception e){ 
      Toast toast = Toast.makeText(context, e.toString(), Toast.LENGTH_LONG); 
      toast.show(); 
     } 
      convertView.invalidate(); 
      return convertView; 
    } 

여기에 getGroupView 방법입니다 :

@Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
      View convertView, ViewGroup parent) {   


     convertView = View.inflate(context, R.layout.expandable_group_layout, null); 
     TextView txtView = (TextView) convertView.findViewById(R.id.txt1);     

     if(groupPosition == 0) { 
      txtView.setText(" MAIN"); 
      txtView.setTextSize(15f); 
      } 
     if(groupPosition == 1) { 
      txtView.setText(" BUDGET"); 
      txtView.setTextSize(15f); 
      } 
     if(groupPosition == 2) { 
      txtView.setText(" FOOD"); 
      txtView.setTextSize(15f); 
      } 
     if(groupPosition == 3) { 
      txtView.setText(" ACCOMMODATION"); 
      txtView.setTextSize(15f); 
      } 

     convertView.invalidate(); 
     return convertView; 

    } 

답변

0

그것은 정확히 같은 일입니다. getChildView 방법을 보통의 getView과 같은 방식으로 취급하십시오. 귀하의 경우에 그래서, 당신은 다음을 수행 할 것 :

@Override 
public int getChildType(int groupPosition, int childPosition) { 
    return groupPosition; 
} 

@Override 
public int getChildTypeCount() { 
    return getGroupCount(); 
} 

@Override 
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
    switch (getChildType(groupPosition, childPosition) { 
    case 1: 
     ViewHolder vh = null; 
     if (convertView == null) { 
      vh = new ViewHolder(); 
      //Inflate your view 
      convertView.setTag(vh); 
     } else { 
      vh = (ViewHolder) convertView.getTag(); 
     } 
     //Load any data into view 
     return convertView; 
    case 2: 
     //Repeat for all expected types 
    } 
} 
+0

무시하려고하지만 난 널 포인터 예외가 있어요. 위의 질문에서 내가 만난 오류를 추가 할 것입니다. – cribal48

+0

ViewHolder를 사용하여 convertView의 태그를 설정해야합니다. 업데이트 코드 –

+0

여전히 같은 오류가 있습니다. LogCat을 게시하고 있습니다. – cribal48

0

는 확장리스트 뷰에서 자식 목록의 재생을 제어하려면 해시 맵에 변경된 데이터를 저장하고 있는지 확인 할 수 있도록 위로 스크롤하거나 해시지도 데이터를 목록으로 파싱하지 않을 때 변경된 데이터를 추적하면 결과를 볼 수 있습니다.

0

나는 거의 동일한 문제가 있었는데, 나는 이것을 https://stackoverflow.com/a/28550013/4342099으로 해결했다.

BaseExpandableListAdapter을 연장하고 난 당신의 형식을 따라 getChildTypeCount()getChildType()