2016-10-10 12 views
0

私は、ドロップダウンのカスタムレイアウトを持つスピナーで作業しています。ここで私の問題は、私が選択すると、ドロップダウンの2番目の項目を言うと、それが選択され、ドロップダウンが閉じます。ドロップダウンを再び開くと、最初の行は同じままですが、2番目の行は最初の行に名前が変更されます。しかし、それはコンソールに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:QWERTY配列 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(今、convertViewがnullでない場合、あなたはそれを更新しない)更新:フィールドで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が2回繰り返されます。 – DJO

+0

ああ、申し訳ありませんが、私はあまりにも速い例を読んでいます。これをもう一度見直した後、 'getCustomView()'にあなたのオブジェクトのフィールドに 'btnDelete'と' savedSearchName'を格納していると思われます。これはおそらく古い内容を壊しているようです。また、ビューを常に更新します(現在、convertViewがnullでない場合は更新しません)。私は答えを更新します。 –

+0

ありがとうございます。はい、それは問題でした。 ViewHolderパターンの使用後、問題は解決されました。 – DJO

関連する問題