Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ListView: How to add data on custom ArrayAdapter?

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)
like image 691
Sal-laS Avatar asked Dec 26 '22 02:12

Sal-laS


2 Answers

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();
    }   
    }

enter image description here

like image 150
Raghunandan Avatar answered Jan 07 '23 01:01

Raghunandan


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..

like image 36
Karan Mavadhiya Avatar answered Jan 07 '23 01:01

Karan Mavadhiya