2015-12-22 47 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