簡體   English   中英

無法從列表視圖中獲取項目 position:嘗試在 null object 參考上調用虛擬方法...

[英]Can't get item position from listview: Attempt to invoke virtual method ... on a null object reference

當我單擊 ListView 上的一個項目時,我試圖顯示一個彈出菜單,但我無法獲得該項目的 position。

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

            }
        });

That code gives me "Attempt to invoke virtual method 'java.lang.Object com.example.securityaplication.ItemArrayAdapter.getItem(int)' on a null object reference" error.

我在另一個項目中做了同樣的事情,效果很好:

        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()”,並且第一個在片段中,而后一個在活動中。

我的 Fragment 它給了我錯誤:

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 成員變量“適配器”。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM