Android - custom ArrayAdapter

Quelqu'un pourrait-il m'aider à résoudre mon problème.
J'ai encore en train de travailler avec DraggingListView et ArrayAdapter.
Maintenant, je veux réaliser supprimer l'élément de listview par clic, mais quand je fait :

StableArrayAdapter.this.notifyDataSetChanged();

- je obtenir nullPointer Exception ...

voici ma carte:

public class StableArrayAdapter extends ArrayAdapter<Product> {
final int INVALID_ID = -1;
LayoutInflater lInflater;
Context ctx;
public static final String PREFS_NAME = "com.shvedchenko.skleroshop";
public static final String PREFS_THEME = "theme";
HashMap<Product, Integer> mIdMap = new HashMap<Product, Integer>();
public StableArrayAdapter(Context context, int textViewResourceId, List<Product> prod) {
super(context, textViewResourceId, /*objects*/prod);
lInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ctx = context;
for (int i = 0; i < prod.size(); ++i) {
mIdMap.put(prod.get(i), i);
}
}
//пункт списка
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
//используем созданные, но не используемые view
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.item, parent, false);
}
Product p = getItem(position);
SharedPreferences pref = ctx.getSharedPreferences(PREFS_NAME, ctx.MODE_PRIVATE);
int theme = pref.getInt(PREFS_THEME, 0);             //getting Integer
if(theme == 0)
((TextView) view.findViewById(R.id.tvDescr)).setTextColor(Color.WHITE);
else
((TextView) view.findViewById(R.id.tvDescr)).setTextColor(Color.BLACK);
((TextView) view.findViewById(R.id.tvDescr)).setText(p.getProductName());
((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.getProductImage());
ImageView iv = (ImageView)view.findViewById(R.id.ivImage);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mIdMap.remove(getItem(position));
System.out.println("FROM CLICK -- " + mIdMap.size() );
/*for( Product p : mIdMap.keySet() ) {
System.out.println( p.getProductName() );
}*/
//StableArrayAdapter.this.notifyDataSetChanged();
}
});
return view;
}
/*@Override
public Object getItem(int position) {
return mIdMap.get(position);
}*/
@Override
public long getItemId(int position) {
if (position < 0 || position >= mIdMap.size()) {
return INVALID_ID;
}
Product item = (Product) getItem(position);
return mIdMap.get(item);
}
@Override
public boolean hasStableIds() {
return true;
}
}

voici l'erreur:

08-26 08:50:58.902 2167-2167/com.shvedchenko.skleroshop
E/AndroidRuntime﹕ EXCEPTION FATALE: principal
java.lang.NullPointerException
au com.shvedchenko.skleroshop.StableArrayAdapter.getItemId(StableArrayAdapter.java:104)
au android.widget de.AdapterView.rememberSyncState(AdapterView.java:1195)
au android.widget de.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:810)
au android.widget de.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:5958)
au android.la base de données.DataSetObservable.notifyChanged(DataSetObservable.java:37)
au android.widget de.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
au android.widget de.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:286)
au com.shvedchenko.skleroshop.StableArrayAdapter$1.onClick(StableArrayAdapter.java:85)
au android.vue.Vue.performClick(point de Vue.java:4204)
au android.vue.Afficher$PerformClick.exécuter(point de Vue.java:17355)
au android.os.Gestionnaire d'.handleCallback(Handler.java:725)
au android.os.Gestionnaire d'.dispatchMessage(Handler.java:92)
au android.os.Looper.boucle(Looper.java:137)
au android.app.ActivityThread.principale(ActivityThread.java:5041)
à java.lang.de réfléchir.La méthode.invokeNative(Native method)
à java.lang.de réfléchir.La méthode.invoke(la Méthode.java:511)
au com.android.interne.os.ZygoteInit$MethodAndArgsCaller.exécuter(ZygoteInit.java:793)
au com.android.interne.os.ZygoteInit.principale(ZygoteInit.java:560)
à dalvik.système.NativeStart.principale(Native method)

/Mis à JOUR/

Ma carte maintenant:

public class StableArrayAdapter extends ArrayAdapter<Product> {
final int INVALID_ID = -1;
LayoutInflater lInflater;
Context ctx;
public static final String PREFS_NAME = "com.shvedchenko.skleroshop";
public static final String PREFS_THEME = "theme";
HashMap<Product, Integer> mIdMap = new HashMap<Product, Integer>();
ArrayList<Product> prods = new ArrayList<Product>();
public StableArrayAdapter(Context context, int textViewResourceId, List<Product> prod) {
super(context, textViewResourceId, /*objects*/prod);
lInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ctx = context;
for (int i = 0; i < prod.size(); ++i) {
mIdMap.put(prod.get(i), i);
prods.add(i,prod.get(i));
}
}
//пункт списка
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
//используем созданные, но не используемые view
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.item, parent, false);
}
Product p = getItem(position);
SharedPreferences pref = ctx.getSharedPreferences(PREFS_NAME, ctx.MODE_PRIVATE);
int theme = pref.getInt(PREFS_THEME, 0);             //getting Integer
if(theme == 0)
((TextView) view.findViewById(R.id.tvDescr)).setTextColor(Color.WHITE);
else
((TextView) view.findViewById(R.id.tvDescr)).setTextColor(Color.BLACK);
((TextView) view.findViewById(R.id.tvDescr)).setText(p.getProductName());
((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.getProductImage());
ImageView iv = (ImageView)view.findViewById(R.id.ivImage);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
prods.remove(position);
StableArrayAdapter.this.notifyData(prods);
}
});
return view;
}
public void notifyData(List<Product> prod) {
//First of all Clear Map
mIdMap.clear();
for (int i = 0; i < prod.size(); ++i) {
mIdMap.put(prod.get(i), i);
}
notifyDataSetChanged();
}
@Override
public long getItemId(int position) {
if (position < 0 || position >= mIdMap.size()) {
return INVALID_ID;
}
Product item = (Product) getItem(position);
return mIdMap.get(item);
}
@Override
public boolean hasStableIds() {
return true;
}
}

/ERREUR/

08-26 09:53:19.270 2530-2530/com.shvedchenko.skleroshop E/AndroidRuntime﹕ EXCEPTION FATALE: principal
java.lang.NullPointerException
au com.shvedchenko.skleroshop.StableArrayAdapter.getItemId(StableArrayAdapter.java:122)
au android.widget de.AdapterView.rememberSyncState(AdapterView.java:1195)
au android.widget de.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:810)
au android.widget de.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:5958)
au android.la base de données.DataSetObservable.notifyChanged(DataSetObservable.java:37)
au android.widget de.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
au android.widget de.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:286)
au com.shvedchenko.skleroshop.StableArrayAdapter.notifyData(StableArrayAdapter.java:112)
au com.shvedchenko.skleroshop.StableArrayAdapter$1.onClick(StableArrayAdapter.java:91)

Ce que je fais de mal?

TNX à l'avance!

ajouter cette notifyDataSetChanged() à l'intérieur de constructeur
Malheureusement..toujours le même..
Il serait utile de savoir où l'exception se produit.
j'ai mis à jour la rubrique
aussi post comment u créer un objet de StableArrayAdapter en activité

OriginalL'auteur kbu | 2014-08-26