ListView: how to add data to a custom ArrayAdapter?

To have a colorful ListView, I created my own ArrayAdapter, but when I want to use adapter.clear() or adapter.add() , it gives me errors. Here are the code and errors.

XML file:

 <ListView android:id="@+id/android:list" android:layout_width="0dip" android:layout_height="wrap_content" android:padding="10dip" android:layout_margin="4dip" android:layout_weight="1"> </ListView> 

Adapter:

 class stableArrayAdapter extends ArrayAdapter<String> { HashMap<String, Integer> mIdMap = new HashMap<String, Integer>(); public stableArrayAdapter(Context context, int textViewResourceId, String [] objects) { super(context, textViewResourceId, objects); for (int i = 0; i < objects.length; ++i) { mIdMap.put(objects[i], i); } } @Override public long getItemId(int position) { String item = getItem(position); return mIdMap.get(item); } @Override public boolean hasStableIds() { return true; } } 

Java Code:

 public class createtarget extends ListActivity { stableArrayAdapter adapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.createtarget); lstView = getListView(); lstView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); lstView.setTextFilterEnabled(true); Target=new String []{""}; adapter = new stableArrayAdapter(this,android.R.layout.simple_list_item_checked, Target); setListAdapter(adapter); } } 

Add code:

 public void submit(View view) { adapter.add("Hello"); } 

Errors:

 06-08 05:21:11.785: E/AndroidRuntime(3584): FATAL EXCEPTION: main 06-08 05:21:11.785: E/AndroidRuntime(3584): java.lang.IllegalStateException: Could not execute method of the activity 06-08 05:21:11.785: E/AndroidRuntime(3584): at android.view.View$1.onClick(View.java:3599) 06-08 05:21:11.785: E/AndroidRuntime(3584): at android.view.View.performClick(View.java:4204) 06-08 05:21:11.785: E/AndroidRuntime(3584): at android.view.View$PerformClick.run(View.java:17355) 06-08 05:21:11.785: E/AndroidRuntime(3584): at android.os.Handler.handleCallback(Handler.java:725) 06-08 05:21:11.785: E/AndroidRuntime(3584): at android.os.Handler.dispatchMessage(Handler.java:92) 06-08 05:21:11.785: E/AndroidRuntime(3584): at android.os.Looper.loop(Looper.java:137) 06-08 05:21:11.785: E/AndroidRuntime(3584): at android.app.ActivityThread.main(ActivityThread.java:5041) 06-08 05:21:11.785: E/AndroidRuntime(3584): at java.lang.reflect.Method.invokeNative(Native Method) 06-08 05:21:11.785: E/AndroidRuntime(3584): at java.lang.reflect.Method.invoke(Method.java:511) 06-08 05:21:11.785: E/AndroidRuntime(3584): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 06-08 05:21:11.785: E/AndroidRuntime(3584): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 06-08 05:21:11.785: E/AndroidRuntime(3584): at dalvik.system.NativeStart.main(Native Method) 06-08 05:21:11.785: E/AndroidRuntime(3584): Caused by: java.lang.reflect.InvocationTargetException 06-08 05:21:11.785: E/AndroidRuntime(3584): at java.lang.reflect.Method.invokeNative(Native Method) 06-08 05:21:11.785: E/AndroidRuntime(3584): at java.lang.reflect.Method.invoke(Method.java:511) 06-08 05:21:11.785: E/AndroidRuntime(3584): at android.view.View$1.onClick(View.java:3594) 06-08 05:21:11.785: E/AndroidRuntime(3584): ... 11 more 06-08 05:21:11.785: E/AndroidRuntime(3584): Caused by: java.lang.UnsupportedOperationException 06-08 05:21:11.785: E/AndroidRuntime(3584): at java.util.AbstractList.add(AbstractList.java:404) 06-08 05:21:11.785: E/AndroidRuntime(3584): at java.util.AbstractList.add(AbstractList.java:425) 06-08 05:21:11.785: E/AndroidRuntime(3584): at android.widget.ArrayAdapter.add(ArrayAdapter.java:179) 06-08 05:21:11.785: E/AndroidRuntime(3584): at net.learn2develop.UsingIntent.createtarget.submit(createtarget.java:136) 06-08 05:21:11.785: E/AndroidRuntime(3584): ... 14 more 06-08 05:21:16.206: E/Trace(3614): error opening trace file: No such file or directory (2) 
+4
source share
5 answers

Try the following. to have an archaist. add a line to arraylist and call notifiydatasetchanged () on your adapter

 public class MainActivity extends ListActivity { stableArrayAdapter adapter; ListView lstView; ArrayList<String> Target = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lstView = getListView(); lstView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); lstView.setTextFilterEnabled(true); Target.add("hi"); Target.add("hello"); adapter = new stableArrayAdapter(this,android.R.layout.simple_list_item_checked, Target); setListAdapter(adapter); Target.add("myname"); adapter.notifyDataSetChanged(); } class stableArrayAdapter extends ArrayAdapter<String> { public stableArrayAdapter(Context context, int textViewResourceId, ArrayList<String> target) { super(context, textViewResourceId, target); } @Override public int getCount() { // TODO Auto-generated method stub return Target.size(); } @Override public String getItem(int position) { // TODO Auto-generated method stub return Target.get(position); } @Override public int getPosition(String item) { // TODO Auto-generated method stub return super.getPosition(item); } @Override public boolean hasStableIds() { return true; } } } 

As ken suggested.

 public class MainActivity extends ListActivity { ListView lstView; ArrayList<String> Target = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lstView = getListView(); lstView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); lstView.setTextFilterEnabled(true); Target.add("hi"); Target.add("hello"); ; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked, Target); setListAdapter(adapter); Target.add("myname"); adapter.notifyDataSetChanged(); } } 

enter image description here

+7
source

I don’t know if this can help you or not.

In my opinion, you should check your XML file. When you use the getListView() method, you must declare your Listview object as

 android:id = @android:id/list 

or

use this line with ArrayAdpater

 arrAdapt.setNotifyOnChange(true); 

May this help you.

+3
source

You forgot to enter your list in the list as shown below:

 lstView = (ListView) findViewById(R.id.yourlistview); 

and then

 lstView = getListView(); 
0
source

You are facing this problem .

In fact, you do not need to extend the ArrayAdapter - it currently does nothing for you.

Instead, do the following:

  List<String> target = new ArrayList<String>(); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked, target); 

Then your .add() call will work.

0
source

To use ListActiivity, you must use id of Listview as - android: id = "@android: id / list".

Then you can get an instance of ListView by calling - getListView (); method.

0
source

Source: https://habr.com/ru/post/1485148/


All Articles