Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create Spinner-list using CustomAdapter in android

in my app,I want to create SpinnerList using CustomAdapter class,For this i wrote below code but when I tap on spinner list then array-List images are not loading in spinner-list as like my below screen why this problem is coming?

main_layout.xml:-

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="vertical"     android:layout_width="fill_parent"     android:layout_height="wrap_content">      <TextView         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:layout_marginTop="10dip"         android:text="Category:"         android:layout_marginBottom="5dp"/>      <Spinner         android:id="@+id/spinner"         android:layout_width="fill_parent"         android:layout_height="wrap_content"/>  </LinearLayout> 

MainActivity:-

public class MainActivity extends AppCompatActivity  {      public static final String[] titles = new String[] { "Strawberry",             "Banana", "Orange", "Hello" };      public static final Integer[] images = { R.drawable.image1,             R.drawable.image2, R.drawable.image3, R.drawable.image4 };      Spinner spinner;     List<RowItem> rowItems;      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main_layout);          rowItems = new ArrayList<RowItem>();         for (int i = 0; i < titles.length; i++) {              RowItem item = new RowItem(titles[i],images[i]);             rowItems.add(item);         }          spinner = (Spinner)findViewById(R.id.spinner);        CustomAdapter adapter = new CustomAdapter(MainActivity.this,             R.layout.listitems_layout, R.id.title, rowItems);         spinner.setAdapter(adapter);     } } 

listitems_layout.xml:-

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:orientation="horizontal">      <ImageView         android:id="@+id/icon"         android:layout_width="80dp"         android:layout_height="80dp"         android:src="@drawable/image1"         android:padding="10dp"         />      <TextView         android:layout_marginTop="30dp"         android:id="@+id/title"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_toRightOf="@+id/icon"         android:textColor="#CC0033"         android:text="Strawberry"         android:textSize="16dp" />  </LinearLayout> 

CustomAdapter:-

package com.example.venkat.spinnerexample1;   import android.app.Activity; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.view.LayoutInflater; import android.widget.ImageView; import android.widget.TextView;  import java.util.List;  public class CustomAdapter extends ArrayAdapter<RowItem> {      LayoutInflater flater;       public CustomAdapter(Activity context,int resouceId, int textviewId, List<RowItem> list){      super(context,resouceId,textviewId, list);     flater = context.getLayoutInflater(); }      @Override     public View getView(int position, View convertView, ViewGroup parent) {          RowItem rowItem = getItem(position);          View rowview = flater.inflate(R.layout.listitems_layout,null,true);          TextView txtTitle = (TextView) rowview.findViewById(R.id.title);         txtTitle.setText(rowItem.getTitle());          ImageView imageView = (ImageView) rowview.findViewById(R.id.icon);         imageView.setImageResource(rowItem.getImageId());          return rowview;     } } 

RowItem:-

package com.example.venkat.spinnerexample1;  public class RowItem {      private int ImageId;     private String Title;      public RowItem(String Title,int ImageId){          this.Title = Title;         this.ImageId = ImageId;     }      public String getTitle(){          return Title;     }      public void setTitle(String Title){          this.Title = Title;     }      public int getImageId(){          return ImageId;     }      public void setImageId(int ImageId){          this.ImageId = ImageId;     }      @Override     public String toString() {         return Title ;     } } 

screen:- ---enter image description here

like image 773
AbhiRam Avatar asked Mar 14 '16 08:03

AbhiRam


People also ask

How can I use more than one spinner in android?

Clearly each of your adapters need to adapt a different set of String s, so you need to create an ArrayAdapter for each Spinner . A single OnItemSelectedListener will work for the 3 Spinners (as long as you set them). You can call getId() on the AdapterView<?>

How Use spinner in android app explain with example?

Android Spinner is a view similar to the dropdown list which is used to select one option from the list of options. It provides an easy way to select one item from the list of items and it shows a dropdown list of all values when we click on it.


2 Answers

Change your adapter like this

public class CustomAdapter extends ArrayAdapter<RowItem> {      LayoutInflater flater;      public CustomAdapter(Activity context, int resouceId, int textviewId, List<RowItem> list){          super(context,resouceId,textviewId, list); //        flater = context.getLayoutInflater();     }      @Override     public View getView(int position, View convertView, ViewGroup parent) {          return rowview(convertView,position);     }      @Override     public View getDropDownView(int position, View convertView, ViewGroup parent) {         return rowview(convertView,position);     }      private View rowview(View convertView , int position){          RowItem rowItem = getItem(position);          viewHolder holder ;         View rowview = convertView;         if (rowview==null) {              holder = new viewHolder();             flater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);             rowview = flater.inflate(R.layout.listitems_layout, null, false);              holder.txtTitle = (TextView) rowview.findViewById(R.id.title);             holder.imageView = (ImageView) rowview.findViewById(R.id.icon);             rowview.setTag(holder);         }else{             holder = (viewHolder) rowview.getTag();         }         holder.imageView.setImageResource(rowItem.getImageId());         holder.txtTitle.setText(rowItem.getTitle());          return rowview;     }      private class viewHolder{         TextView txtTitle;         ImageView imageView;     } } 
like image 97
shubham goyal Avatar answered Sep 27 '22 19:09

shubham goyal


Inside your adapter constructor, send the id of textview also

public CustomAdapter(Activity context,int resouceId, int textviewId, List<RowItem> list){          super(context,resouceId,textviewId, list);         flater = context.getLayoutInflater();     } 

call it by

CustomAdapter adapter = new CustomAdapter(MainActivity.this,                 R.layout.listitems_layout, R.id.title, rowItems); 

EDIT Your images are not showing because you didn't override the getDropdownView() method. This method decides the layout of child when dropdown is visible. So add this method to your adapter

@Override         public View getDropDownView(int position, View convertView, ViewGroup parent) {             if(convertView == null){                 convertView = flater.inflate(R.layout.list_itemslayout,parent, false);             }             RowItem rowItem = getItem(position);             TextView txtTitle = (TextView) convertView.findViewById(R.id.title);             txtTitle.setText(rowItem.getTitle());             ImageView imageView = (ImageView) convertView.findViewById(R.id.icon);             imageView.setImageResource(rowItem.getImageId());             return convertView;         } 

Suggestion in your getView() put a check for (convertview == null). It might not have any impact on this small adapter but in case your adapter is having more items, it will impact the performance.

EDIT To put your spinner dropdown below the anchor, use

android:overlapAnchor="false" inside your spinner

like image 20
Ankit Aggarwal Avatar answered Sep 27 '22 20:09

Ankit Aggarwal