2012-05-03 8 views
0

ユーザーがリストをクリックすると、MyCustomAdapterを更新して、ハッシュキー、値のペアを削除してリストを更新する必要があります。onListItemClickの後にカスタムベースアダプタを更新する方法は?

は、私は本当にあなたが助けることができるonListItemClickにダウンこだわっ

おかげでグラハム

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 

答えて

0

あなたは、アダプタのデータセット(どうやらあなたMDATA)を変更し、アダプタのnotifyDataSetChangedメソッドを呼び出す必要があります。

+0

ありがとうChristophe、onDataItemClickからmDataに簡単にアクセスすることをお勧めしますか? MyCustomAdapterのインスタンスを作成してmDataを更新する必要がありますか? – user803271

+0

また、 'MyCustomAdapter'でキャストしてmDataを変更して通知する' listView.getAdapter() 'を使ってアダプタを取得することもできます... – ChristopheCVB

+0

getViewからアダプタを更新するのはどうですか? http://stackoverflow.com/questions/18584430/updated-views-in-list-item-dont-stay-updated-when-scrolling-through-listviewim/18584559#18584559 – ChuckKelly

関連する問題