2012-05-03 73 views
0

我有一個包含鍵值對的自定義BaseAdapter。在我的ListView中,當我點擊列表中的一個項目時,我想從列表中刪除它。我的問題是我不知道如何執行notifyDataSetChanged - 請參閱下面的onListItemClick無法從onListItemClick()上的自定義BaseAdapter中刪除項目

我有一個在MyCustomAdapter這是造成痛苦的構造函數。

下面的代碼是兩個類。

1類

Dynamiclists extends ListActivity

2類

MyCustomAdapter extends BaseAdapter

在1類,我想從在現在的位置的HashMap地圖由onListItemClick然後指示刪除更新第2級。

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

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


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 

回答

0

我對縮進有點麻煩,但是您確認您的onListItemClick函數刪除了正確的HashMap/row嗎?如果是的話,在onListItemClick通話結束:

getListAdapter().notifyDataSetChanged(); 

不過,我不喜歡你如何使用position,喜歡這裏例如tkeys[position]。位置是指數可見項目,id是索引全部項目。但是,如果它有效,那麼我沒有任何抱怨。

我沒有測試過這一點,但它應該作爲一種替代方法的工作(假設map是ListView控件從內置集合:

public void onListItemClick(ListView l, View v, int position, long id) { 
    MyCustomAdapter adapter = getListAdapter(); 
    map.remove(adapter.get((int) id)); 
    adapter.notifyDataSetChanged(); 
} 
+0

薩姆嗨,我覺得onListItemClick也是不正確現在的位置表示列表中的位置,所以在位置0我想刪除hashmap map中的條目,然後notifydatasetchange。我有點困惑如何做到這一點 – user803271

+0

謝謝薩姆我會給它一個去,很多appreicated格雷厄姆 – user803271

+0

我再次更新它,這個應該可以工作,但我仍然無法看到你的應用程序的模式。 – Sam

相關問題