1

I want to add spinner values to listview on button click in fragment. Actually my screen contain two spinner and a listview. I just want to add spinner values to the list on button click. I have written some code for it but Iam getting null pointer exception in it. here is my code:

   public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.activity_thirdswipe, container, false);
    arraylistAdd = new ArrayList<DeviceInfo>();
    spinner = (Spinner) rootView.findViewById(R.id.spnDevice);

    spinnerArrayAdapter = new ArrayAdapter<String>(rootView.getContext(), R.layout.spinner_items, spinnerArray); //selected item will look like a spinner set from XML
    spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(spinnerArrayAdapter);
    spinner = (Spinner) rootView.findViewById(R.id.spnAction);
    spinnerArrayAdapter = new ArrayAdapter<String>(rootView.getContext(), R.layout.spinner_items, spinnerArray); //selected item will look like a spinner set from XML
    spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(spinnerArrayAdapter);
    btnAdd = (Button) rootView.findViewById(R.id.buttonAdd);

    listOnAdd = (ListView) rootView.findViewById(R.id.listDynamic);     
    deviceType = spinner.getSelectedItem().toString();
    actionType = spinner.getSelectedItem().toString();
    Log.i("item", deviceType +" "+ actionType);
    adp=new CustomListDynamic(getActivity(),R.layout.custom_add_list,arraylistAdd);
    btnAdd.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            info = new DeviceInfo();
            info.setAction(actionType);
            info.setDevice(deviceType);

            arraylistAdd.add(info);
            for(int i=0;i<arraylistAdd.size();i++){
                Log.i("itemArray", arraylistAdd.get(i).getDevice());
            }
            adp.notifyDataSetChanged();
        }
    });
    listOnAdd.setAdapter(adp);

    return rootView;
}

My customAdpter class is following:

    public class CustomListDynamic  extends ArrayAdapter<DeviceInfo> {
Context context;
List<DeviceInfo> objects;   
int layoutResourceId;

    public CustomListDynamic(Context context, int layoutResourceId,
            List<DeviceInfo> rowItems) {
        super(context, layoutResourceId, rowItems);
        this.context = context;
        this.layoutResourceId = layoutResourceId;
        objects = rowItems;

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

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

            TextView txtDeviceType;
            TextView txtActionType;
        }
       public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            final DeviceInfo rowItem = getItem(position);

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if (convertView == null) {

                convertView = inflater.inflate(R.layout.custom_add_list, null);
                holder = new ViewHolder(); 
                holder.txtDeviceType = (TextView) convertView.findViewById(R.id.txtDeviceType);
                holder.txtDeviceType = (TextView) convertView.findViewById(R.id.txtMobileNumber);     
                convertView.setTag(holder);
            } else
                holder = (ViewHolder) convertView.getTag();
                holder.txtDeviceType.setText(rowItem.getDevice());
                holder.txtActionType.setText(rowItem.getAction());
                Log.i("device set", rowItem.getDevice());
            return convertView;
        }          
}

Logcat:

 05-20 18:41:49.301: E/AndroidRuntime(2083):    at       android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
 05-20 19:08:34.661: E/AndroidRuntime(2439): FATAL EXCEPTION: main
 05-20 19:08:34.661: E/AndroidRuntime(2439): java.lang.NullPointerException
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at com.example.test.CustomListDynamic.getView(CustomListDynamic.java:66)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.AbsListView.obtainView(AbsListView.java:2159)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.ListView.makeAndAddView(ListView.java:1831)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.ListView.fillDown(ListView.java:674)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.ListView.fillFromTop(ListView.java:735)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.ListView.layoutChildren(ListView.java:1638)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.AbsListView.onLayout(AbsListView.java:1994)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.View.layout(View.java:14008)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.ViewGroup.layout(ViewGroup.java:4373)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.View.layout(View.java:14008)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.ViewGroup.layout(ViewGroup.java:4373)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1021)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.View.layout(View.java:14008)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.ViewGroup.layout(ViewGroup.java:4373)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.View.layout(View.java:14008)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.ViewGroup.layout(ViewGroup.java:4373)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1141)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.View.layout(View.java:14008)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.ViewGroup.layout(ViewGroup.java:4373)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
 05-20 19:08:34.661: E/AndroidRuntime(2439):    at android.view.View.layout(View.java:14008)

Please let me know the solution if anybody has..thanks

user3421261
  • 183
  • 9

2 Answers2

1

try change your code with this,

public class CustomListDynamic  extends ArrayAdapter<DeviceInfo> {
Context context;
List<DeviceInfo> objects;   
int layoutResourceId;

    public CustomListDynamic(Context context, int layoutResourceId,
            List<DeviceInfo> rowItems) {
        super(context, layoutResourceId, rowItems);
        this.context = context;
        this.layoutResourceId = layoutResourceId;
        objects = rowItems;

    }

       private class ViewHolder {

            TextView txtDeviceType;
            TextView txtActionType;
        }

       public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            DeviceInfo rowItem = object.get(position);

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if (convertView == null) {

                convertView = inflater.inflate(R.layout.custom_add_list, null);
                holder = new ViewHolder(); 
                holder.txtDeviceType = (TextView) convertView.findViewById(R.id.txtDeviceType);
                holder.txtDeviceType = (TextView) convertView.findViewById(R.id.txtMobileNumber);     
                convertView.setTag(holder);

            } else
                holder = (ViewHolder) convertView.getTag();

              holder.txtDeviceType.setText(rowItem.getDevice());
              holder.txtActionType.setText(rowItem.getAction());
              Log.i("device set", rowItem.getDevice());
            return convertView;
        }          
     }

Changes:

remove getItemId and getCount because you don't needed on ArrayAdapter, you need those in BaseAdapter class, super on constructor class handle that

change

 final DeviceInfo rowItem = getItem(position);

to

 DeviceInfo rowItem = objects.get(position);

Update

if you have an error on

 "holder.txtActionType.setText(rowItem.getAction());"

3 possibility exists.

1- holder.txtActionType is null

2- rowItem is null

3- rowItem.getAction() is null

your Problem:

you not initialize holder.txtActionType in your code.

i think this is copy paste problem:

holder.txtDeviceType = (TextView) convertView.findViewById(R.id.txtDeviceType);
holder.txtDeviceType = (TextView) convertView.findViewById(R.id.txtMobileNumber); 

both line you initialize txtDeviceType one of them must be holder.txtActionType

Shayan Pourvatan
  • 11,898
  • 4
  • 42
  • 63
0

when you are click on button at that time you have to set data for the adapter. Then you have to write notifidatasetchange method.

In your case you will get rowItem value is null that means List<DeviceInfo> objects; is also get null object value.

now Your code is

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.activity_thirdswipe, container, false);
    arraylistAdd = new ArrayList<DeviceInfo>();
    spinner = (Spinner) rootView.findViewById(R.id.spnDevice);

    spinnerArrayAdapter = new ArrayAdapter<String>(rootView.getContext(), R.layout.spinner_items, spinnerArray); //selected item will look like a spinner set from XML
    spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(spinnerArrayAdapter);
    spinner = (Spinner) rootView.findViewById(R.id.spnAction);
    spinnerArrayAdapter = new ArrayAdapter<String>(rootView.getContext(), R.layout.spinner_items, spinnerArray); //selected item will look like a spinner set from XML
    spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(spinnerArrayAdapter);
    btnAdd = (Button) rootView.findViewById(R.id.buttonAdd);

    listOnAdd = (ListView) rootView.findViewById(R.id.listDynamic);     
    deviceType = spinner.getSelectedItem().toString();
    actionType = spinner.getSelectedItem().toString();
    Log.i("item", deviceType +" "+ actionType);
    adp=new CustomListDynamic(getActivity(),R.layout.custom_add_list,arraylistAdd);
    btnAdd.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            info = new DeviceInfo();
            info.setAction(actionType);
            info.setDevice(deviceType);

            arraylistAdd.add(info);
            for(int i=0;i<arraylistAdd.size();i++){
                Log.i("itemArray", arraylistAdd.get(i).getDevice());
            }
            **adp.setObjectValue(info);** //set value of your object from here
            adp.notifyDataSetChanged();
        }
    });
    listOnAdd.setAdapter(adp);

    return rootView;
}

And your Custome Adapter class will be like This

 public class CustomListDynamic  extends ArrayAdapter<DeviceInfo> {
Context context;
List<DeviceInfo> objects;   
int layoutResourceId;

    public CustomListDynamic(Context context, int layoutResourceId,
            List<DeviceInfo> rowItems) {
        super(context, layoutResourceId, rowItems);
        this.context = context;
        this.layoutResourceId = layoutResourceId;
        objects = rowItems;

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

    public void setObjectValue(List<DeviceInfo> info){
       objects=info;
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
       private class ViewHolder {

            TextView txtDeviceType;
            TextView txtActionType;
        }
       public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            final DeviceInfo rowItem = getItem(position);

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if (convertView == null) {

                convertView = inflater.inflate(R.layout.custom_add_list, null);
                holder = new ViewHolder(); 
                holder.txtDeviceType = (TextView) convertView.findViewById(R.id.txtDeviceType);
                holder.txtDeviceType = (TextView) convertView.findViewById(R.id.txtMobileNumber);     
                convertView.setTag(holder);
            } else
                holder = (ViewHolder) convertView.getTag();
                holder.txtDeviceType.setText(rowItem.getDevice());
                holder.txtActionType.setText(rowItem.getAction());
                Log.i("device set", rowItem.getDevice());
            return convertView;
        }          
}
bhavesh kaila
  • 761
  • 1
  • 5
  • 25