Cannot use this in a static context android spinner - java

I am trying to add few items in the spinner list. But somehow everytime, I always get the below exception on this-
Cannot use this in a static context
Below is my code
public static void initSpinnerView(Context context, Spinner spinnerView, String prefix, int numItems, int layout) {
//spinnerView = (Spinner) findViewById(R.id.spinner2);
List<String> list = new ArrayList<String>();
list.add("list 1");
list.add("list 2");
list.add("list 3");
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerView.setAdapter(dataAdapter);
}
}
Can anyone tell me what wrong I am doing here?

this
This is a Java keyword indicateing the current object. If I am not wrong, this method is placed in an class that extends Activity. Hence, this refers to the Activity object( which is used as Context in this case). And since it is a static method, you cannot used the keyword this or non-static variables.
In order to fix it,change to this line:
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, list);

In java you can not use this in static methods (static context).
Static methods do not point to any instance of the enclosing class.

You are using this in static method which is not legal in java.

Related

How do we add livedata to spinner in Java

How can we use livedata in spinners? I have the following:
ArrayAdapter<CharSequence> adapter;
LiveData<List<Site>> sites = SiteDatabase.getInstance(this).siteDao().getAllSites();
Spinner spinner = findViewById(R.id.spinnerSites);
adapter = new ArrayAdapter<Site>(this,
this,android.R.layout.simple_spinner_dropdown_item, sites); //What Goes Here ? This gives Cannot Resolve Constructor Error...
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
Thanks!
You need to replace this line
adapter = new ArrayAdapter<Site>(this,android.R.layout.simple_dropdown_item_1line, sites);
with this
adapter = new ArrayAdapter<Site(this,android.R.layout.simple_dropdown_item_1line, sites.getValue());
The signature for your ArrayAdapter is like this ArrayAdapter(Context context, int resource, List<Site> objects). You are correctly passing the Context and int param however the last param needs to be a List<Site> instead of a LiveData<List<Site>.

Android Studio, populating listView from innerclass

Here is my code, when i use
List<String> array = new ArrayList<String>();
array.add("kk");
array.add("bb");
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
listView1.setAdapter(adapter);
This will work fine in my onCreate method, but the problem is I can't us 'this' in an anonynmous class. replacing 'this' with getApplicationContext() does not work for some reason, either inside or outside the onCreate.
like this
ArrayAdapter adapter = new ArrayAdapter(getApplicationContext(),android.R.layout.simple_list_item_1,array);
Can anyone help me find the issue I have searched a lot but can not find an answer on this anywhere
Thanks
I would pass the this-pointer via parameter in the constructor of the inner class and save it in a inner class field, like this ->
public class outerclass{
#Override
protected void onCreate(Bundle savedInstanceState){
//.. other stuff
innerclass ic = new innerclass(this);
//.. other stuff
}
public class innerclass{
private Context c;
public innerclass(Context c){
this.c = c;
}
}
}
When you use an adapter to add something into a list or an array, you need to alert the list, in this case array, that there was a change. After you call the add function, you need to call adapter.notifyDataSetChanged()
Also, when declaring the adapter, declare it outside of onCreate() then assign your values inside onCreate()
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItems);
See below:
public class MainActivity extends AppCompatActivity {
// List of array strings that will represent list items
public static ArrayList<String> listItems = new ArrayList<String>();
// Array string will handle the information stored in the listview
public static ArrayAdapter<String> adapter;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lView = (ListView) findViewById(R.id.list);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
listItems);
lView.setAdapter(adapter);
}
}
Then you can call:
listItems.add(<value>);
adapter.notifyDataSetChanged();
Then if need be you also have access to:
listItems.clear(); and adapter.clear();
Hope this helps!
I assume your anonymous class is inside your MainActivity. If this is the case you can simply do:
ArrayAdapter adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array);
When you use "this" inside your anonymous class, it refers to the anonymous inner class instance and not the instance of the outer class.

There are two errors, I can not solve it(ListView)


			
				
Move your adapter initialization inside onCreate. You need to set the adapter to the ListView using setAdapter. Call noftifyDataSetChanged after populating the dataset arr.
Try this code,
private MyAdapter ma;
onCreate(){
...
setContentView(R.layout.activty_main2);
lv = (ListView) findViewById(R.id.lv_1);
ma = new MyAdapter(this, arr);
lv.setAdapter(ma);
initData();
}
initData(){
for(;;){
...
arr.add(n);
}
ma.noftifyDataSetChanged();
}
You not having any blank constructor in MyAdapter,
you have to pass context and ArrayList to the adapter like,
MyAdapter ma = new MyAdapter(Main2Activity.this,arr);

Populating a list-view with an arraylist

I keep getting this error http://prntscr.com/3qygj9 (Sorry, I couldnt copy and paste) from this segment of code
final ArrayList<HashMap<String, String>> foodList = db.getAllFood();
if(foodList.size() != 0){
ListView listView = (ListView) findViewById(R.id.foodListView);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
foodList );
listView.setAdapter(arrayAdapter);
}
I can't for the life of me figure out why. Thanks in advance!
please Use ArrayAdapter<HashMap<String, String>> instead of ArrayAdapter<String>
ArrayAdapter<HashMap<String, String>> arrayAdapter = new ArrayAdapter<HashMap<String, String>>(
this,
android.R.layout.simple_list_item_1,
foodList );
The type you're using to build the ArrayAdapter does not look compatible at all.
To build an ArrayAdapter<String>, the last argument to the constructor should be of type ArrayList<String>. But in your code, the foodList variable you pass for that argument is of type ArrayList<HashMap<String, String>>.

Listview with spinner in Android

Hey guys I am trying to create a menu using a listview with the code I have shown below. The code I have shown will show Item1, Item2 and Item3 in a list. Now I want to be able to add a spinner to item1 and item2. Is that possible? If so how would i go about doing it.
public class MyList extends ListActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] MyList = new String[] { "Item1","Item2","Item3"};
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, MyList));
}
Yes, It is possible. Try the following code. You will get it.
String[] MyList = new String[] { "Item1","Item2","Item3"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, MyList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
I think you need to create custom list view for doing that you can start by following this particular tutorial :
Tutorial
This link may be helpful to you :
Link

Categories