【问题标题】:startDrag() gets NullPointerException with first view when fixed size GridView Item当固定大小的 GridView 项时,startDrag() 在第一个视图中获取 NullPointerException
【发布时间】:2016-05-30 04:52:52
【问题描述】:

我有一个 GridView。 GridView 中的每个项目都包含一些 ImageView 和 TextView。在 onLongPress() 处理程序中,我在 ImageView 上调用 startDrag。没有 gridView 的第一项,一切正常。我得到了 NullPointerExpception:

 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)

我能够验证传递给 startDrag 的所有参数都是非空的 - ClipData、DragShadowBuilder 和我的视图作为 LocalState。这是代码sn-p:

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

我发现如果在adapter中设置固定大小的GridView item,就会出现这个问题。

     @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; 
     }

那么,在这种情况下我可以做些什么并保持 GridView 项目的固定大小。

【问题讨论】:

    标签: android gridview nullpointerexception drag-and-drop


    【解决方案1】:

    我发现我的 GridView 的第一项在 invalidate() 时也无法更新视图。 我读了一些线程,它可能是因为试图访问尚未膨胀的视图而发生的。 所以,我找到了我的代码的解决方案,并保持 GridView 项目的固定大小。仅在 convertView = null 时设置。

        @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; 
         }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多