Reputation: 11659
To have a colorful ListView I have created my own ArrayAdapter, but when I want to use adapter.clear()
or adapter.add()
it gives me errors. Here is 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)
Upvotes: 5
Views: 27040
Reputation: 133570
Try the below. have a arraylist. add string 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();
}
}
Upvotes: 7
Reputation: 23279
You are encountering this problem.
You don't actually need to extend ArrayAdapter
- currently it's not doing anything for you.
Instead do this:
List<String> target = new ArrayList<String>();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked, target);
Then later your .add()
call will work.
Upvotes: 0
Reputation: 325
To use ListActiivity you have to use id of Listview as - android:id="@android:id/list" .
Then only you can get the instance of ListView by calling - getListView(); method .
Upvotes: 0
Reputation: 1052
I dont know these may help you or not..
As per my opinion You should check your xml file..
When you use getListView()
method you should declare your Object of Listview like
android:id = @android:id/list
Or
use these line with your ArrayAdpater
arrAdapt.setNotifyOnChange(true);
May these help you..
Upvotes: 3
Reputation: 12753
you forgot to intialize your listview like below:
lstView = (ListView) findViewById(R.id.yourlistview);
and then
lstView = getListView();
Upvotes: 0