2015-12-22 87 views
1

所以我試着做一個下拉菜單,其中菜單上的每個項目對應一個城市的名稱(紐約,洛杉磯,舊金山等) 。下拉菜單中的城市/項目數對於每個用戶都不同,因此我不能使用switch語句。所以,讓我通過代碼來介紹你們,這很有道理。如何在使用紡紗器時從textview中獲取文本

1)我首先製作了這個CitySpinner ArrayAdapter,並在該類中有一個名爲getCustomView的方法,它返回一個視圖。

public View getCustomView(int position, View convertView, ViewGroup parent) 
    { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View layout = inflater.inflate(R.layout.spinner_cityfolder,parent,false); 

     TextView cityName = (TextView) layout.findViewById(R.id.tvLanguage); 

     ImageView cityImage = (ImageView) layout.findViewById(R.id.imgLanguage); 

     cityName.setText(foldersArrayList.get(position).getName()); 
     cityImage.setImageResource(R.drawable.small_icon_bar); 

     return layout; 
    } 

    // It gets a View that displays in the drop down popup the data at the specified position 
    @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) 
    { 
     return getCustomView(position, convertView, parent); 
    } 

2)現在在我顯示的下拉菜單中的活動我做一個實例的微調,稱爲dropDownSpinner並傳遞citySpinner適配器。

citySpinner = new CitySpinner(getApplicationContext(),R.layout.spinner_cityfolder,Global_Class.getInstance().getValue().cityFoldersArrayList); 

dropDownspinner.setAdapter(citySpinner); 

3),那麼我做onItemSelectedListener,在這裏,我試圖讓他們點擊文件夾的名稱的文本。然後將它與我在某些全球數據列表中的所有城市名稱進行比較。如果他們匹配,給我一些信息。但問題是,當我使用下面的folderName.getText()時,它引用了null。無論如何,我可以獲得當前視圖的文字嗎?

dropDownspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
         { 
          @Override 
          public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l)//Create a class that returns a custom View that's a textView of the city Name. 
          { 
           check++; 
           if(check > 1) 
           { 
            TextView folderName = (TextView) findViewById(R.id.tvLanguage); 
            for(CityFolders TempFolders: Global_Class.getInstance().getValue().cityFoldersArrayList) 
            { 
             if(adapterView.getAdapter().equals(citySpinner)) 
             { 
              if(((CitySpinner) adapterView.getAdapter()).getCityName(i).equals(TempFolders.getName())) 
              { 
               //Toast.makeText(getApplicationContext(),((CitySpinner) adapterView.getAdapter()).getCityName(i),Toast.LENGTH_SHORT).show(); 
               Spinner newDropDownSpiner = (Spinner) findViewById(R.id.spinner); 
               newDropDownSpiner.setAdapter(new CardSpinner(getApplicationContext(),R.layout.spinner_cards,TempFolders.getCards())); 
               //dropDownspinner.setAdapter(new CardSpinner(getApplicationContext(), R.layout.spinner_cards, TempFolders.getCards())); 
               break; 


              } 
              else 
              { 
               //Do nothing 
              } 
             } 
             else 
             { 
              Toast.makeText(getApplicationContext(),"Not the same type of spinner",Toast.LENGTH_SHORT).show(); 
             } 

            } 

           } 
           else 
           { 
            //Do nothing 
           } 
          } 

這裏是我的堆棧跟蹤:

12-22 13:58:29.627 9553-9553/com.lorentzos.swipecards.example E/AndroidRuntime:致命異常:主要

Process: com.lorentzos.swipecards.example, PID: 9553 


java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference 
                       at com.lorentzos.swipecards.MyActivity$1$1.onItemSelected(MyActivity.java:176) 
                       at android.widget.AdapterView.fireOnSelected(AdapterView.java:914) 
                       at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:903) 
                       at android.widget.AdapterView.access$300(AdapterView.java:48) 
                       at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:873) 
                       at android.os.Handler.handleCallback(Handler.java:739) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:135) 
                       at android.app.ActivityThread.main(ActivityThread.java:5430) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:372) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706) 

佈局tvLanguage

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="75dp" 
    android:padding="3dip" 
    android:background="#434343"> 

    <ImageView 
     android:id="@+id/imgLanguage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_launcher" > 
    </ImageView> 

    <TextView 
     android:id="@+id/tvLanguage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dp" 
     android:layout_marginTop="8dp" 
     android:text="Text Here" 
     android:textColor="#86f6e7"> 
    </TextView> 

</LinearLayout> 
+1

你能後的佈局'tvLanguage'是的XML? –

+0

@安德魯布魯克是啊,我把它貼在上面。 – TheQ

回答

1

CitySpinner是您的適配器,所以你可以這樣做:

dropDownspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Override 
public void onItemSelected(AdapterView <? > adapterView, View view, int i, long l) //Create a class tha returns a custom View that's a textView of the city Name. 
{ 
    check++; 
    if (check > 1) { 
     TextView folderName = (TextView) view.findViewById(R.id.tvLanguage); 
     for (CityFolders TempFolders: Global_Class.getInstance().getValue().cityFoldersArrayList) { 
      if ((adapterView.getAdapter() instanceof CitySpinner) && ((CitySpinner)adapterView.getAdapter()).getCityAt(i).equals(TempFolders.getName())) 
      { 
       dropDownspinner.setAdapter(new CardSpinner(getApplicationContext(), R.layout.spinner_cards, TempFolders.getCards())); 
       break; 


      } else { 
       //Do nothing 
      } 
     } 

    } else { 
     //Do nothing 
    } 
} 

,並提供您的適配器getCityAt

//... 
public String getCityAt(int position){ 
    return foldersArrayList.get(position).getName(); 
} 
//... 
+0

老兄非常感謝,它幾乎可以工作。所以我做了一個城市文件夾名稱的乾杯。但是,當我把dropDownSpinner.setAdapter(...)線我不斷收到此錯誤: ava.lang.ClassCastException:com.lorentzos.swipecards.Spinners.CardSpinner無法轉換爲com.lorentzos.swipecards。 Spinners.CitySpinner – TheQ

+0

錯誤行位於if語句中。我的意思是,我認爲if語句沒有錯,但是當我重置適配器時,它說我不能將CardSpinner轉換爲citySpinner,或者至少考慮這樣做。 – TheQ

+0

我只是更新if語句,現在檢查適配器是否實際上是CitySpinner。檢查出來並檢查它現在是否有效。 – vincenzo