无法从列表视图获取项目位置:尝试在空对象引用上调用虚方法...
Can't get item position from listview: Attempt to invoke virtual method ... on a null object reference
我试图在单击 ListView 上的某个项目时显示弹出菜单,但我无法获取该项目的位置。
listax.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
ItemList item= adapter.getItem(position);
Toast.makeText(getContext(), item.getTxtNomeItem().toString(), Toast.LENGTH_SHORT).show();
//showPopup(adapterView);
}
});
该代码给出了“尝试在空对象引用上调用虚拟方法 'java.lang.Object com.example.securityaplication.ItemArrayAdapter.getItem(int)'”错误。
我在另一个项目中做了同样的事情并且效果很好:
listax.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
modelo item = adapter.getItem(position);
Toast.makeText(getApplicationContext(),
item.getNome().toString (), Toast.LENGTH_SHORT).show();
}
});
唯一的区别是我使用了“getContext”而不是“getApplicationContext()”,因为它不接受“getApplicationContext()”并且第一个在片段中,而后者在activity.
我的片段给我错误:
public class HomeFragment extends Fragment implements PopupMenu.OnMenuItemClickListener {
ItemArrayAdapter adapter;
private ListView listax;
public HomeFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
listax = (ListView)view.findViewById(R.id.listViewx);
ArrayList<ItemList> ItemList = new ArrayList<>();
ItemArrayAdapter itemArrayAdapter = new ItemArrayAdapter(getActivity(), R.layout.adapter_view_layout,ItemList);
listax.setAdapter(itemArrayAdapter);
listax.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
ItemList item= adapter.getItem(position);
Toast.makeText(getContext(), item.getTxtNomeItem().toString(), Toast.LENGTH_SHORT).show();
//showPopup(adapterView);
}
});
return view;
}
public void showPopup(View v){
PopupMenu popup = new PopupMenu(getActivity(), v);
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.menupopup);
popup.show();
}
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch(menuItem.getItemId()){
case R.id.itemAlterar:
Toast.makeText(getActivity(), "Item 1 clicked", Toast.LENGTH_LONG).show();
return true;
case R.id.itemExcluir:
Toast.makeText(getActivity(), "Item 2 clicked", Toast.LENGTH_LONG).show();
return true;
case R.id.itemEmprestar:
Toast.makeText(getActivity(), "Item 3 clicked", Toast.LENGTH_LONG).show();
return true;
case R.id.itemRecuperar:
Toast.makeText(getActivity(), "Item 3 clicked", Toast.LENGTH_LONG).show();
return true;
default:
return false;
}}
}
不要忘记在设置 ListAdapter 时使用 class 成员变量“adapter”。
//ItemArrayAdapter itemArrayAdapter = new ItemArrayAdapter(getActivity(), R.layout.adapter_view_layout,ItemList);
//listax.setAdapter(itemArrayAdapter);
adapter = new ItemArrayAdapter(getActivity(), R.layout.adapter_view_layout,ItemList);
listax.setAdapter(adapter);
我试图在单击 ListView 上的某个项目时显示弹出菜单,但我无法获取该项目的位置。
listax.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
ItemList item= adapter.getItem(position);
Toast.makeText(getContext(), item.getTxtNomeItem().toString(), Toast.LENGTH_SHORT).show();
//showPopup(adapterView);
}
});
该代码给出了“尝试在空对象引用上调用虚拟方法 'java.lang.Object com.example.securityaplication.ItemArrayAdapter.getItem(int)'”错误。
我在另一个项目中做了同样的事情并且效果很好:
listax.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
modelo item = adapter.getItem(position);
Toast.makeText(getApplicationContext(),
item.getNome().toString (), Toast.LENGTH_SHORT).show();
}
});
唯一的区别是我使用了“getContext”而不是“getApplicationContext()”,因为它不接受“getApplicationContext()”并且第一个在片段中,而后者在activity.
我的片段给我错误:
public class HomeFragment extends Fragment implements PopupMenu.OnMenuItemClickListener {
ItemArrayAdapter adapter;
private ListView listax;
public HomeFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
listax = (ListView)view.findViewById(R.id.listViewx);
ArrayList<ItemList> ItemList = new ArrayList<>();
ItemArrayAdapter itemArrayAdapter = new ItemArrayAdapter(getActivity(), R.layout.adapter_view_layout,ItemList);
listax.setAdapter(itemArrayAdapter);
listax.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
ItemList item= adapter.getItem(position);
Toast.makeText(getContext(), item.getTxtNomeItem().toString(), Toast.LENGTH_SHORT).show();
//showPopup(adapterView);
}
});
return view;
}
public void showPopup(View v){
PopupMenu popup = new PopupMenu(getActivity(), v);
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.menupopup);
popup.show();
}
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch(menuItem.getItemId()){
case R.id.itemAlterar:
Toast.makeText(getActivity(), "Item 1 clicked", Toast.LENGTH_LONG).show();
return true;
case R.id.itemExcluir:
Toast.makeText(getActivity(), "Item 2 clicked", Toast.LENGTH_LONG).show();
return true;
case R.id.itemEmprestar:
Toast.makeText(getActivity(), "Item 3 clicked", Toast.LENGTH_LONG).show();
return true;
case R.id.itemRecuperar:
Toast.makeText(getActivity(), "Item 3 clicked", Toast.LENGTH_LONG).show();
return true;
default:
return false;
}}
}
不要忘记在设置 ListAdapter 时使用 class 成员变量“adapter”。
//ItemArrayAdapter itemArrayAdapter = new ItemArrayAdapter(getActivity(), R.layout.adapter_view_layout,ItemList);
//listax.setAdapter(itemArrayAdapter);
adapter = new ItemArrayAdapter(getActivity(), R.layout.adapter_view_layout,ItemList);
listax.setAdapter(adapter);