2016-07-12 15 views
0

Ich versuche, ein Pop-up-Fenster nach dem Klicken auf eine Schaltfläche in einer ListView, und schließen Sie es dann durch Klicken außerhalb des Feldes. Dieser Fehler tritt jedoch auf, wenn ich versuche, auf die Schaltfläche zu klicken.Null-Zeiger-Ausnahme beim Versuch, ein Popup-Fenster in einem ListView mit benutzerdefinierten Adapter zu erstellen

                    java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.IBinder android.view.View.getWindowToken()' on a null object reference 
                        at android.widget.PopupWindow.showAtLocation(PopupWindow.java:897) 
                        at logistica.enviaflores.com.logistica.utilities.MyAdapter$1.onClick(MyAdapter.java:81) 
                        at android.view.View.performClick(View.java:4780) 
                        at android.view.View$PerformClick.run(View.java:19866) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:135) 
                        at android.app.ActivityThread.main(ActivityThread.java:5254) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at java.lang.reflect.Method.invoke(Method.java:372) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Ich kann nicht genau verstehen, was ich falsch mache, um eine Nullzeigerausnahme zu werfen. Vielleicht kodiere ich es falsch, aber es scheint mir auch dann richtig zu sein, wenn ich zurückgehe und es mir anschaue. Jede Hilfe würde sehr geschätzt werden.

public class MyAdapter extends BaseAdapter { 
    private Context mContext; 
    private List<Bean> mList; 
    private PopupWindow popUpWindow; 
    private LayoutInflater inflater; 

public MyAdapter(Context context,List<Bean> list){ 
    mContext=context; 
    mList=list; 


} 

@Override 
public int getCount() { 
    return mList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return mList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    //use convertView recycle 
    if(convertView==null){ 
     holder=new ViewHolder(); 
     convertView = LayoutInflater.from(mContext).inflate(R.layout.content_orders, parent, false); 
     holder.textView= (TextView) convertView.findViewById(R.id.textView2); 
     holder.imageView= (ImageView) convertView.findViewById(R.id.imageView2); 
     holder.information= (Button) convertView.findViewById(R.id.button5); 
     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    //set text and url 
    holder.information.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 


      inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      ViewGroup container = (ViewGroup) inflater.inflate(R.layout.information_popup, null); 
      popUpWindow = new PopupWindow(container, 400,400,true); 
//***I believe the problem happens right in the line under this sentence!*** 
      popUpWindow.showAtLocation(v.findViewById(R.id.orders), Gravity.CENTER, 0,0); 

      container.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View view, MotionEvent motionEvent) { 
        popUpWindow.dismiss(); 
        return true; 
       } 
      }); 
     } 
    }); 

    holder.textView.setText(mList.get(position).getText()); 
    Picasso.with(mContext).load(mList.get(position).getUrl()).resize(500,500).into(holder.imageView); 

    return convertView; 
} 

class ViewHolder{ 
    TextView textView; 
    ImageView imageView; 
    Button information; 
    Button close; 

    } 
} 
+1

Bitte posten Sie den vollständigen Logcat, vielleicht können wir etwas Nützliches daraus ableiten. Achten Sie auch auf die Zeilennummern und versuchen Sie, für uns die Zeile Ihres Codes zu markieren, an der der Fehler auftritt. – Vucko

+0

@Vucko Ich habe jetzt den Logcat gepostet. Der Fehler tritt in dem Onclick-Listener innerhalb des Adapters auf. Ich nahm an, dass es ein wenig offensichtlich wäre, aber danke, dass du es für diejenigen aufgezeigt hast, die es nicht verstehen würden. :) – Kekis2014

+0

Stellen Sie sicher, dass eine Ansicht mit ID ** R.id.Orders ** existiert in ** v ** –

Antwort

2

Statt für des Suchens R.id.orders im Informationen Schaltfläche Ansicht, suchen in der convertView

Alter Code:

popUpWindow.showAtLocation(v.findViewById(R.id.orders), Gravity.CENTER, 0,0); 

Neuer Code:

popUpWindow.showAtLocation(convertView.findViewById(R.id.orders), Gravity.CENTER, 0,0);