2017-08-11 76 views
-1

我有一个图像视图作为数组adpater/listview的一部分。 imageView是列表视图中每个项目左侧的设置图标。当用户点击图像时,出现一个弹出式菜单。但到目前为止,我无法显示菜单。我推动了一个setOnClickListener的形象,但仍然没有去。有人能告诉我我在这里做错了什么。弹出式菜单实施是在适配器还是活动中完成的?到目前为止,我已经尝试了两种方法,但都无效。由于 mainActivity弹出菜单不工作arrayAdapter listview

package com.example.george.hostscanmenus; 

import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.PopupMenu; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 

    List hostList; 
    ArrayAdapter<String> hostAdapter; 
    PopupMenu popup; 
    String subnet = "192.168.10."; 
    ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     hostList = new ArrayList<String>(); 


     //populating host addresses 
     for(int i = 0; i < 255; i++) { 
      hostList.add(subnet+i +"-aa:bb:00:cc:33:ee"); 
     } 

     //inflating adapter 
     listView = (ListView) findViewById(R.id.scan_list); 
     hostAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.host_item, R.id.ip_address, hostList); 
     listView.setAdapter(hostAdapter); 


    } 

} 

适配器

package com.example.george.hostscanmenus; 

import android.content.Context; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.view.LayoutInflater; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.PopupMenu; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 

/** 
* Created by george on 8/11/17. 
*/ 

public class HostAdapter extends ArrayAdapter<String> { 

    public HostAdapter(Context context, int num, ArrayList<String> allHost) { 
     super(context, 0, allHost); 
    } 

    @NonNull 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Get the data item for this position 
     String host = getItem(position); 
     // Check if an existing view is being reused, otherwise inflate the view 
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.activity_main, parent, false); 
     } 
     // Lookup view for data population 
     ImageView settingImgView = (ImageView) convertView.findViewById(R.id.settings_img); 
     ImageView nodeHostImgView = (ImageView) convertView.findViewById(R.id.host_icon); 
     TextView nodeIpTxtView = (TextView) convertView.findViewById(R.id.ip_address); 
     TextView nodeMacTxtView = (TextView) convertView.findViewById(R.id.mac_address); 
     ImageView nodeArrowImgView = (ImageView) convertView.findViewById(R.id.port_scan_arrow); 
     // Populate the data into the template view using the data object 
     settingImgView.setImageResource(R.drawable.ic_action_more_vert); 
     nodeHostImgView.setImageResource(R.drawable.ic_computer_white_24dp); 
     nodeIpTxtView.setText(host.substring(0,host.indexOf("-"))); 
     nodeMacTxtView.setText(host.substring(host.indexOf("-"))); 
     nodeArrowImgView.setImageResource(R.drawable.ic_keyboard_arrow_right_white_24dp); 

     settingImgView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       showPopupMenu(view); 
      } 
     }); 

     // Return the completed view to render on screen 
     return convertView; 
    } 


    /* code for popup menu in listview */ 
    public void showPopupMenu(View v) { 
     PopupMenu popup = new PopupMenu(getContext(), v); 
     popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem menuItem) { 
       switch (menuItem.getItemId()) { 
        case R.id.change_icon: 
         Toast.makeText(getContext(), menuItem.getTitle(), Toast.LENGTH_SHORT).show(); 
         return true; 
        case R.id.notifications: 
         Toast.makeText(getContext(), menuItem.getTitle(), Toast.LENGTH_SHORT).show(); 
         return true; 
        default: 
         return false; 
       } 
      } 
     }); 

     MenuInflater inflater = popup.getMenuInflater(); 
     inflater.inflate(R.menu.host_menu, popup.getMenu()); 
     popup.show(); 
    } 

} 

列表项的XML文件

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <LinearLayout 
     android:id="@+id/text_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <ImageView 
      android:id="@+id/settings_img" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="0.10" 
      android:padding="3dp" 
      android:src="@drawable/ic_action_more_vert"/> 

     <ImageView 
      android:id="@+id/host_icon" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="0.20" 
      android:padding="5dp" 
      android:src="@drawable/ic_computer_white_24dp"/> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.50" 
      android:orientation="vertical" 
      android:paddingLeft="0dp" 
      > 

      <TextView 
       android:id="@+id/ip_address" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textSize="18dp" 
       tools:text="192.168.10.100" 
       /> 

      <TextView 
       android:id="@+id/mac_address" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textSize="16dp" 
       tools:text="aa:bb:cc:00:11:22" 
       /> 
     </LinearLayout> 

     <ImageView 
      android:id="@+id/port_scan_arrow" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="0.20" 
      android:padding="5dp" 
      android:src="@drawable/ic_keyboard_arrow_right_white_24dp"/> 

    </LinearLayout> 
</RelativeLayout> 

主要XML文件

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:ads="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/scan_list_linear" 
    tools:context=".MainActivity"> 

    <!--Listview to display scan output--> 
    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/scan_list"/> 

</LinearLayout> 

菜单XML

<!-- listview menu for host scan options eg: 
    change hostname, icon, notification etc --> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <!-- Settings, should always be in the overflow --> 
    <item android:id="@+id/change_icon" 
     android:title="change icon" 
     /> 


    <item android:id="@+id/notifications" 
     android:title="set notification" 
     /> 

</menu> 

回答

0

弹出式菜单是根据活动而不是上下文创建的。因此,首先在适配器的构造函数中添加活动。您将把活动的上下文发送到super()并将活动保存在私有字段变量中。

public class HostAdapter extends ArrayAdapter { private activity activity;
公共HostAdapter(活动活动,INT NUM,ArrayList的allHost){
超级(activity.getApplicationContext(),0,allHost);
this.activity = activity;
}

现在你弹出的方法,使用该活动,而不是的getContext()。

公共无效showPopupMenu(视图v){
PopupMenu的弹出=新的PopupMenu(活性,V);
//继续您的工作