Ashadi
Ashadi

Reputation: 25

Custom Adapter Spinner can not display all values

no error was found but the results are displayed on the value of the spinner is not complete. I take the value of the spinner from string-array in xml, this example :

<string-array name="digit">
  <item>1</item>
  <item>2</item>
  <item>3</item>
  <item>4</item>
  <item>5</item>
  <item>6</item>
  <item>7</item>
  <item>8</item>
  <item>9</item>
  <item>10</item>
  <item>11</item>
  <item>12</item>
  <item>13</item>
  <item>14</item>
  <item>15</item>
  <item>16</item>
  <item>17</item>
  <item>18</item>
  <item>19</item>
</string-array>

and the results I get :

1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6

why the results that appear to restore the initial value ? please help to check for errors, this example script :

public class CustomAdapterSpinner extends BaseAdapter {
    private Context ctx;
    private LayoutInflater layoutInflater;
    private List<String> data;

    public CustomAdapterSpinner(Context context, List<String> data) {
        this.ctx = context;
        this.data = data;
        layoutInflater = (LayoutInflater) ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        if (view == null) {
            view = layoutInflater.inflate(R.layout.spinner_rows, parent, false);
            TextView textView = (TextView) view.findViewById(R.id.text1);
            ImageView imageView = (ImageView) view.findViewById(R.id.image1);
            imageView.getLayoutParams().height = 55;
            imageView.getLayoutParams().width = 55;
            imageView.setPadding(0, 10, 0, 10);

            textView.setText(data.get(position));
            textView.setPadding(10, 10, 0, 10);
            textView.setTypeface(null, Typeface.BOLD);
            textView.setTextSize(18);
            imageView.setImageResource(R.drawable.digit;

        return view;
    }

and this I put in myfragment

List<String> listStrings = Arrays.asList(getResources().getStringArray(R.array.digit));
CustomAdapterSpinner adapter = new CustomAdapterSpinner (getActivity(), listStrings);
spinner.setAdapter(adapter);

please help and many thanks

Upvotes: 0

Views: 446

Answers (1)

Vilas
Vilas

Reputation: 1705

Make use of view holder.

Create a static class as

static class ViewHolder
{
    TextView textView;
    ImageView imageView;
}

Add this class inside adapter class, so it must be a inner class.

Then change your getView() method as follows.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (converView== null) {
        converView= layoutInflater.inflate(R.layout.spinner_rows, bull);
        viewHolder=new ViewHolder();
        viewHolder.textView = (TextView) view.findViewById(R.id.text1);
        viewHolder.imageView = (ImageView) view.findViewById(R.id.image1);
        viewHolder.imageView.getLayoutParams().height = 55;
        viewHolder.imageView.getLayoutParams().width = 55;
        viewHolder.imageView.setPadding(0, 10, 0, 10);


        viewHolder.textView.setPadding(10, 10, 0, 10);
        viewHolder.textView.setTypeface(null, Typeface.BOLD);
        viewHolder.textView.setTextSize(18);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder) convertView.getTag();
    }
        viewHolder.textView.setText(data.get(position));
        imageView.setImageResource(R.drawable.digit;

      return convertView;
}

This is completely untested code.

Hope this helps.

Upvotes: 1

Related Questions