0

When a user clicks on a list I need a way to update MyCustomAdapter such that a hash key,value pair is removed and the list is updated.

I'm really stuck down in onListItemClick can you help

thanks graham

protected void onListItemClick(ListView l, View v, int position, long id) { 
    //TODO Auto-generated method stub 

    Toast.makeText(getApplicationContext(),"SHORT click"  , Toast.LENGTH_LONG).show();
    Toast.makeText(getApplicationContext(),"DATA is" + map.entrySet() , Toast.LENGTH_LONG).show();  //NAME,VALUE
    //remove the key,value pair and update CustomAdapter 

    ????? 
    //end of remove entries from hashmap map   


} 


package telephone.org;



import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
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<String, Integer> mData = new HashMap<String,Integer>();
    private String[] mKeys;
    //constructor    
    public MyCustomAdapter(DynamicLists dynamicLists, int row, HashMap<String, Integer> 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<String, Integer> map = new HashMap<String, Integer>(); 





/** 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 

    Toast.makeText(getApplicationContext(),"SHORT click"  , Toast.LENGTH_LONG).show();
    Toast.makeText(getApplicationContext(),"DATA is" + map.entrySet() , Toast.LENGTH_LONG).show();  //NAME,VALUE
    //remove the name,value pair 


    //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<Entry<String, Integer>> 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<String,Integer> 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()); 
    }

//NEW CODE 
MyCustomAdapter custom = (new MyCustomAdapter(DynamicLists.this, R.layout.row, map));
setListAdapter(custom);
custom.notifyDataSetChanged();
//END NEW CODE 
}

//end CONVERT SET BACK TO HASHMAP


@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
//END INTERACTION WITH SERVICE 

} //end of class 1 
user803271
  • 115
  • 5
  • 16

1 Answers1

0

You have to modify the adapter's dataset (apparently your mData) and call the notifyDataSetChanged method of the adapter.

ChristopheCVB
  • 7,269
  • 1
  • 29
  • 54
  • Thanks Christophe, could you recommend an easy way to access mData from onListItemClick. Should I create an instance of MyCustomAdapter and then update mData ? – user803271 May 03 '12 at 21:03
  • Or you can also retrieve the adapter with `listView.getAdapter()` that you will cast in `MyCustomAdapter`and change the mData and notify it... – ChristopheCVB May 03 '12 at 22:37
  • what about updating the adapter from inside getView? http://stackoverflow.com/questions/18584430/updated-views-in-list-item-dont-stay-updated-when-scrolling-through-listviewim/18584559#18584559 – ChuckKelly Sep 03 '13 at 05:34