Note that there are some explanatory texts on larger screens.

plurals
  1. POunable to remove items from custom BaseAdapter on onListItemClick()
    text
    copied!<p>I have a custom <code>BaseAdapter</code> which contains key-value pairs. In my <code>ListView</code>, when I short click on an item in the list I would like to remove it from the list. My problem is I do not know how to execute <code>notifyDataSetChanged</code> - see <code>onListItemClick</code> below. </p> <p>I have a constructor in <code>MyCustomAdapter</code> which is causing the pain. </p> <p>Below code is two classes. </p> <p><strong>Class 1</strong></p> <p><code>Dynamiclists extends ListActivity</code></p> <p><strong>Class 2</strong></p> <p><code>MyCustomAdapter extends BaseAdapter</code></p> <p>In class 1, I would like to remove from the <code>HashMap</code> map at postion indicated by <code>onListItemClick</code> and then update class 2.</p> <pre><code>package telephone.org; import java.util.HashMap; import java.util.Set; import java.util.Map.Entry; import telephone.org.MyService.LocalBinder; import android.app.ActivityManager; import android.app.ListActivity; import android.app.ActivityManager.RunningServiceInfo; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.IBinder; import android.provider.ContactsContract; import android.provider.ContactsContract.PhoneLookup; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.AdapterView.OnItemLongClickListener; //class 1 public class DynamicLists extends ListActivity { MyService mService; boolean mBound = false; //class 2 /////////////////////////////////// public class MyCustomAdapter extends BaseAdapter { public HashMap&lt;String, Integer&gt; mData = new HashMap&lt;String,Integer&gt;(); private String[] mKeys; //constructor public MyCustomAdapter(DynamicLists dynamicLists, int row, HashMap&lt;String, Integer&gt; map){ mData = map; mKeys = mData.keySet().toArray(new String[map.size()]); Log.d(TAG, "INSIDE ADAPTER constructor HELLO WORLD " + map.entrySet()); } public MyCustomAdapter(MyService mService, int row, Object map) { // TODO Auto-generated constructor stub } @Override public View getView(int position, View convertView, ViewGroup parent) { //TODO Auto-generated method stub Log.d(TAG, "inside getview "); View row=convertView; if (row==null){ LayoutInflater inflater=getLayoutInflater(); row=inflater.inflate(R.layout.row, null); } TextView label =(TextView)row.findViewById(R.id.blocked); label.setText(mKeys[position] + " " + getItem(position).toString()); //key + value return row; } @Override public int getCount() { // TODO Auto-generated method stub return mData.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub Log.d(TAG, "inside getitem " + mData.get(mKeys[position])); return mData.get(mKeys[position]); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } } //end of class 2 //////////////////////// private static final String TAG = "DynamicList"; //class 1 public static HashMap&lt;String, Integer&gt; map = new HashMap&lt;String, Integer&gt;(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { //TODO Auto-generated method stub //remove entries from hashmap map String selection = l.getItemAtPosition(position).toString(); String[] tkeys; tkeys = map.keySet().toArray(new String[map.size()]); Integer toremove = map.get(tkeys[position]); Toast.makeText(this, "The value is" + map.get(tkeys[position]), Toast.LENGTH_LONG).show(); map.remove(toremove); //how to notify MyCustomAdapter of changes //end of remove entries from hashmap map } @Override public void onStart() { super.onStart(); isMyServiceRunning(); } public void onStop() { super.onStop(); // Unbind from the service if (mBound) { unbindService(mConnection); mBound = false; } } private boolean isMyServiceRunning() { ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if ("telephone.org.MyService".equals(service.service.getClassName())) { Toast.makeText(getApplicationContext(),"SERVICE IS RUNNING", Toast.LENGTH_LONG).show(); Intent intent = new Intent(this, MyService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); //SEE INTERACT WITH SERVICE BELOW return true; } } Toast.makeText(getApplicationContext(),"SERVICE IS STOPPED AND IS NOT RUNNING", Toast.LENGTH_LONG).show(); return false; } //INTERACT WITH SERVICE /** Defines callbacks for service binding, passed to bindService() */ private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { // We've bound to LocalService, cast the IBinder and get LocalService instance LocalBinder binder = (LocalBinder) service; mService = binder.getService(); mBound = true; Set&lt;Entry&lt;String, Integer&gt;&gt; whatsup = mService.getNumbers(); Toast.makeText(getApplicationContext(),"NUMBER INTERACTION IS" + whatsup, Toast.LENGTH_LONG).show(); Log.d(TAG, "ELEMENTS from service are:" + whatsup); Toast.makeText(getApplicationContext(),"NUMBER OF ENTRIES IS" + whatsup.size(), Toast.LENGTH_LONG).show(); //convert SET BACK TO HASHMAP for (Entry&lt;String,Integer&gt; entry : whatsup) { String name = null; String[] projection = new String[] { ContactsContract.PhoneLookup.DISPLAY_NAME}; Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(entry.getKey())); Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if (cursor.moveToFirst()) { name = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); } Toast.makeText(getApplicationContext(),"RESOLVED NAME IS " + name, Toast.LENGTH_LONG).show(); projection = null; map.put(name,entry.getValue()); } setListAdapter(new MyCustomAdapter(DynamicLists.this, R.layout.row, map)); } //end CONVERT SET BACK TO HASHMAP @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; } }; //END INTERACTION WITH SERVICE } //end of class 1 </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload