Android 如何将弹出菜单添加到每个项目的自定义列表视图中
我一度陷入困境。 我想在自定义列表视图中为每个项目添加弹出菜单。 我试过了,但它只是在列表的最后一个位置或最后一项出现。我得到了它出现在最后一个位置的原因,但没有得到解决方案 这里我添加了适配器类Android 如何将弹出菜单添加到每个项目的自定义列表视图中,android,listview,android-custom-view,Android,Listview,Android Custom View,我一度陷入困境。 我想在自定义列表视图中为每个项目添加弹出菜单。 我试过了,但它只是在列表的最后一个位置或最后一项出现。我得到了它出现在最后一个位置的原因,但没有得到解决方案 这里我添加了适配器类 public class InterestLevelAdapterEditable extends BaseAdapter { private Activity activity; private TextView level; private InterestLevel
public class InterestLevelAdapterEditable extends BaseAdapter {
private Activity activity;
private TextView level;
private InterestLevel m;
private LayoutInflater inflater;
private List<InterestLevel> interestLevelList;
public InterestLevelAdapterEditable(Activity activity, List<InterestLevel> interestLevelList) {
this.activity = activity;
this.interestLevelList = interestLevelList;
}
@Override
public int getCount() {
return interestLevelList.size();
}
@Override
public Object getItem(int location) {
return interestLevelList.get(location);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater == null)
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null)
convertView = inflater.inflate(R.layout.interest_level_editable, null);
TextView sports_name = (TextView) convertView.findViewById(R.id.sportsName);
level = (TextView) convertView.findViewById(R.id.level);
m = interestLevelList.get(position);
sports_name.setText(m.getSports_name());
level.setText(m.getLevel());
level.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Creating the instance of PopupMenu
PopupMenu popup = new PopupMenu(activity, level);
//Inflating the Popup using xml file
popup.getMenuInflater().inflate(R.menu.popup_level, popup.getMenu());
//registering popup with OnMenuItemClickListener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
level.setText(item.getTitle());
return true;
}
});
popup.show();//showing popup menu
}
});
return convertView;
}
}
公共类InterestlevelAdapterEdit扩展BaseAdapter{
私人活动;
私有文本视图级别;
私人利益水平m;
私人充气机;
私人利益清单;
public InterestleLevel AdapterEdit(活动,列表InterestleLevel列表){
这个。活动=活动;
this.interestLevelList=interestLevelList;
}
@凌驾
public int getCount(){
return interestLevelList.size();
}
@凌驾
公共对象getItem(int位置){
返回interestLevelList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
如果(充气器==null)
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
if(convertView==null)
convertView=充气机。充气(R.layout.interest\u level\u可编辑,空);
TextView sports_name=(TextView)convertView.findViewById(R.id.sportsName);
level=(TextView)convertView.findViewById(R.id.level);
m=利息水平列表。获取(位置);
sports_name.setText(m.getSports_name());
level.setText(m.getLevel());
level.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//创建PopupMenu的实例
PopupMenu popup=新的PopupMenu(活动、级别);
//使用xml文件打开弹出窗口
popup.getMenuInflater().充气(R.menu.popup_level,popup.getMenu());
//向OnMenuItemClickListener注册弹出窗口
setOnMenuItemClickListener(新的PopupMenu.OnMenuItemClickListener(){
公共布尔onMenuItemClick(菜单项){
level.setText(item.getTitle());
返回true;
}
});
popup.show();//显示弹出菜单
}
});
返回视图;
}
}
我得到的理由是,我必须在单击侦听器时传递position,但没有得到我应该如何添加position或(m object of InterestLevel,它具有position)
提前谢谢 在
setOnClickListener()
和show()
中创建PopupMenu
外部
我需要像listview一样的弹出菜单。我尝试了这段代码,它是正确的()
private静态最终字符串TITLE=“TITLE”;
私有静态最终字符串ICON=“ICON”;
私有列表数据=新的ArrayList();
//使用此选项可将项目添加到ListPopupWindow将使用的列表中
私有void附加项(字符串标题,int-iconResourceId){
HashMap=newHashMap();
地图放置(标题,标题);
map.put(图标,iconResourceId);
数据。添加(地图);
}
//如果要显示ListPopupWindow,请调用此选项
私有void showListMenu(查看锚定){
ListPopupWindow-popupWindow=新ListPopupWindow(此);
ListAdapter=新的SimpleAdapter(
这
数据,
android.R.layout.activity\u list\u item,//您可能需要使用自己的酷布局
新字符串[]{TITLE,ICON},//这些仅仅是存储数据的键
使用
新int[]{android.R.id.text1,android.R.id.icon});//视图id
将数据映射到
popupWindow.setAnchorView(锚);
popupWindow.setAdapter(适配器);
setWidth(400);//注意:不要使用像素,使用dimen资源
popupWindow.setOnItemClickListener(myListener);//选择列表项时的回调
popupWindow.show();
}
感谢Shadab的回答,但此解决方案不会将列表项值更新到每个位置,而是像以前一样只更新最后一个列表项值。因此,我们需要传递每个位置更新项目文本的位置。
//Creating the instance of PopupMenu
final PopupMenu popup = new PopupMenu(activity, level);
//Inflating the Popup using xml file
popup.getMenuInflater().inflate(R.menu.popup_level, popup.getMenu());
//registering popup with OnMenuItemClickListener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
level.setText(item.getTitle());
return true;
}
});
level.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popup.show();//showing popup menu
}
});
private static final String TITLE = "title";
private static final String ICON = "icon";
private List<HashMap<String, Object>> data = new ArrayList<HashMap<String,
Object>>();
// Use this to add items to the list that the ListPopupWindow will use
private void addItem(String title, int iconResourceId) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put(TITLE, title);
map.put(ICON, iconResourceId);
data.add(map);
}
// Call this when you want to show the ListPopupWindow
private void showListMenu(View anchor) {
ListPopupWindow popupWindow = new ListPopupWindow(this);
ListAdapter adapter = new SimpleAdapter(
this,
data,
android.R.layout.activity_list_item, // You may want to use your own cool layout
new String[] {TITLE, ICON}, // These are just the keys that the data
uses
new int[] {android.R.id.text1, android.R.id.icon}); // The view ids
to map the data to
popupWindow.setAnchorView(anchor);
popupWindow.setAdapter(adapter);
popupWindow.setWidth(400); // note: don't use pixels, use a dimen resource
popupWindow.setOnItemClickListener(myListener); // the callback for when a list item is selected
popupWindow.show();
}