2016-05-30 1 views
0

Ich habe eine GridView. Jedes der Elemente in der GridView enthält einige ImageView und TextView. Im onLongPress() - Handler rufe ich den startDrag auf dem ImageView auf. Alles funktioniert ohne das erste Element von gridView. Ich erhalte die NullPointerExpception mit ihm:startDrag() ruft NullPointerException mit der ersten Ansicht bei fester Größe GridView Item

E/View: Unable to initiate drag 
E/View: java.lang.NullPointerException: Attempt to read from field 'android.view.IWindowSession android.view.View$AttachInfo.mSession' on a null object reference 
E/View:  at android.view.View.startDrag(View.java:20983) 
E/View:  at com.abc.xyz.util.view.CustomGridView$1.onItemLongClick(ES.java:55) 
E/View:  at android.widget.AbsListView.performLongPress(AbsListView.java:3939) 
E/View:  at android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:3864) 
E/View:  at android.os.Handler.handleCallback(Handler.java:739) 
E/View:  at android.os.Handler.dispatchMessage(Handler.java:95) 
E/View:  at android.os.Looper.loop(Looper.java:158) 
E/View:  at android.app.ActivityThread.main(ActivityThread.java:7229) 
E/View:  at java.lang.reflect.Method.invoke(Native Method) 
E/View:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
E/View:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

konnte ich überprüfen, ob alle der zu startgebenen Argumente waren nicht-null - ein ClipData, ein DragShadowBuilder, und meiner Ansicht nach als LocalState. Hier ist der Code-Schnipsel:

ClipData.Item item = new ClipData.Item(((ABC) getItemAtPosition(position)).getUri()); 
String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN}; 
ClipData data = new ClipData("", mimeTypes, item); 
data.addItem(new ClipData.Item(position + "")); 
DragShadowBuilder shadowBuilder = new DragShadowBuilder(view.findViewById(R.id.img)); 
view.startDrag(data, // data to be dragged 
     shadowBuilder, // drag shadow 
     view, // local data about the drag and drop operation 
     0 // no needed flags 
); 

Ich fand, dass, wenn festgelegte Größe von Gridview-Elemente in Adapter befestigt ist, wird das Problem auftreten.

 @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     ... 
     v.setLayoutParams(new AbsListView.LayoutParams((int) mContext.getResources().getDimension(R.dimen.pp_item_w), 
        (int) mContext.getResources().getDimension(R.dimen.pp_item_h))); 
     return v; 
    } 

Also, was ich in diesem Fall tun kann und fixierte Größe von GridView Artikel behalten.

+0

Mögliche Duplikat [Was für eine Nullpointer ist, und wie kann ich es beheben?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do- ich befestige es) –

Antwort

0

Ich habe festgestellt, dass das erste Element meiner GridView auch nicht anzeigen kann, wenn invalidate(). Ich habe einen Thread gelesen, dass es passieren könnte, weil ich versuche, auf eine Ansicht zuzugreifen, die noch nicht aufgeblasen wurde. Also, ich habe die Lösung für meinen Code gefunden und fixierte Größe von GridView Element festgelegt. Das wird nur gesetzt, wenn convertView = null ist.

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     ... 
     if(v == null) { 
       ... 
       v.setLayoutParams(new AbsListView.LayoutParams((int) mContext.getResources().getDimension(R.dimen.pp_item_w), 
        (int) mContext.getResources().getDimension(R.dimen.pp_item_h))); 
     } else { 
       ... 
     } 
     return v; 
    } 
Verwandte Themen