2016-10-10 3 views
0

드롭 다운에 대한 사용자 정의 레이아웃이있는 스피너에서 작업했습니다. 여기에 내 문제가 있는데, 내가 선택할 때, 드롭 다운의 두 번째 항목을 말하면 선택되고 드롭 다운이 닫힙니다. 드롭 다운을 다시 열면 첫 번째 행은 동일하게 유지되지만 두 번째 행은 첫 번째 행으로 이름이 변경됩니다. 하지만 그것은 log.d를 콘솔로 출력 할 때 그 위치를 알려줍니다 : 2가 선택되었습니다.선택된 스피너 항목이 스피너의 첫 번째 행으로 바뀝니다

여기 내 코드입니다,

@Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     return getCustomView(position, convertView, parent); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     TextView textView = (TextView) convertView.inflate(getContext(), android.R.layout.simple_spinner_item, null); 
     textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); 
     textView.setTextColor(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.blue)); 
     if(list.getIsRecent()){ 
      textView.setText("Most Recent "); 
     } else { 
      textView.setText(list.get(position).getName()); 
     } 
     return textView; 
    } 

    public View getCustomView(final int position, View convertView, ViewGroup parent) { 
     boolean isRecent; 
     isRecent = list.get(position).getIsRecent(); 
     if (convertView == null) { 
       convertView = inflater.inflate(R.layout.custom_spinner_layout, parent, false); 
       savedSearchName = (TextView) convertView 
         .findViewById(R.id.custom_spinner_layout_text_view); 


      btnDelete = (ImageButton) convertView 
         .findViewById(R.id.custom_spinner_layout_button); 

      relativeLayoutContainer = (RelativeLayout) convertView.findViewById(R.id.relativeLayout_item_name_container); 
      relativeLayoutContainer.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Log.d(TAG,"relativeLayoutContainer: setOnClickListener: position"+position); 
        Method method = null; 
        if(mSavedSearchCriteriaSpinner != null) { 
         mSavedSearchCriteriaSpinner.setSelection(position); 
         try { 
          method = Spinner.class.getDeclaredMethod("onDetachedFromWindow"); 
          method.setAccessible(true); 
          method.invoke(mSavedSearchCriteriaSpinner); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }); 


      if(isRecent){ 
       btnDelete.setVisibility(View.INVISIBLE); 
       savedSearchName.setText(list.get(position).getName() + "MOSTRECENT"); 
      } else { 
       savedSearchName.setText(list.get(position).getName()); 
       btnDelete.setVisibility(View.VISIBLE); 

       btnDelete.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         //AlertDialog 
       }); 
      } 

     } 
     return convertView; 
    } 

스크린 샷 : 선택 초기 회 전자 Initial Spinner

회 전자 드롭 다운 Spinner dropdown

위치 1 : 쿼티 position 1 selected: qwerty

재개 용 드롭 다운 Reopening dropdown

그리고 이것은 숙제 문제가 아닙니다.

답변

1

getView()에서 convertView를 잘못 사용하고 있습니다. 이것은 null이거나 재활용해야하는 이전보기 일 수 있습니다. null 인 경우 새로운보기를 전개해야합니다. 되지 않은 경우,이 재활용 될 필요가 오래된 항목 (텍스트를 수정해야 즉, 당신도 다시 텍스트 크기 및 색상을 설정할 필요가 없습니다)입니다 : 또한

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     TextView textView = convertView; 
     if (convertView == null) { 
      LayoutInflater li = LayoutInflater.from(parent); 
      textView = (TextView) li.inflate(getContext(), android.R.layout.simple_spinner_item, null); 
      textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); 
      textView.setTextColor(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.blue)); 
     } 
     if(list.getIsRecent()){ 
      textView.setText("Most Recent "); 
     } else { 
      textView.setText(list.get(position).getName()); 
     } 
     return textView; 
    } 

, getCustomView이 btnDelete를 저장한다 개체의 필드에 savedSearchName을 입력하면 아마도 오래된 내용이 엉망이 될 것입니다. (convertView 당신이 그것을 업데이트하지 않는 null가 아닌 경우, 지금) 또한, 항상 convertView를 업데이트 : 필드에 savedSearchNamebtnDelete를 저장 약

public View getCustomView(final int position, View convertView, ViewGroup parent) { 
    boolean isRecent; 
    isRecent = list.get(position).getIsRecent(); 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.custom_spinner_layout, parent, false); 
    } 

    TextView savedSearchName = (TextView) convertView.findViewById(R.id.custom_spinner_layout_text_view); 


    ImageButton btnDelete = (ImageButton) convertView.findViewById(R.id.custom_spinner_layout_button); 

    RelativeLayout relativeLayoutContainer = (RelativeLayout) convertView.findViewById(R.id.relativeLayout_item_name_container); 
    relativeLayoutContainer.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d(TAG,"relativeLayoutContainer: setOnClickListener: position"+position); 
      Method method = null; 
      if(mSavedSearchCriteriaSpinner != null) { 
       mSavedSearchCriteriaSpinner.setSelection(position); 
       try { 
        method = Spinner.class.getDeclaredMethod("onDetachedFromWindow"); 
        method.setAccessible(true); 
        method.invoke(mSavedSearchCriteriaSpinner); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 


    if(isRecent){ 
     btnDelete.setVisibility(View.INVISIBLE); 
     savedSearchName.setText(list.get(position).getName() + "MOSTRECENT"); 
    } else { 
     savedSearchName.setText(list.get(position).getName()); 
     btnDelete.setVisibility(View.VISIBLE); 

     btnDelete.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        //AlertDialog 
      }); 
    } 

    return convertView; 
} 

, 당신이 그들을 다시 검색을 피하려고하기 때문이다 같아요. 이 경우 홀더 패턴을 사용하는 것이 좋습니다. 예를 들어 보기 소유자의보기 객체 보류 다음을 참조하십시오. Google guide.

+0

예, 동의합니다. 그러나 드롭 다운 문제는 여전히 지속됩니다. item1을 선택하면 드롭 다운을 다시 열 때 item0이 두 번 반복됩니다. – DJO

+0

아, 죄송합니다. 예제를 너무 빨리 읽었습니다. 다시 검토 한 결과, 객체의 필드에'btnDelete'와'savedSearchName'을'getCustomView()'에 저장하고 있기 때문에 아마도 이것은 오래된 내용을 엉망으로 만든 것 같습니다. 또한 항상 뷰를 업데이트하십시오 (현재 convertView가 null이 아닌 경우 뷰를 업데이트하지 않습니다). 나는 대답을 업데이트 할 것이다. –

+0

고맙습니다. 네, 그게 문제였습니다. ViewHolder 패턴을 사용하면 문제가 해결되었습니다. – DJO

관련 문제