Cannot resolve getSystemService method in ListView adapter

后端 未结 8 1360
深忆病人
深忆病人 2021-01-25 00:23

I am working through John Horton\'s Android Programming for Beginners, and am currently attempting to create a note-taking app. Horton has just introduced ListVie

相关标签:
8条回答
  • 2021-01-25 00:28

    Create a class variable and a Constructor for your adapter:

    Context context;
    public NoteAdapter(Context context){
    this.context = context;
    }
    

    Then initialize the layoutinflater the following way:

    LayoutInflater inflater = LayoutInflater.from(context);
    
    0 讨论(0)
  • 2021-01-25 00:36

    You should pass Context to your adapter and then replace this line:

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    

    I hope this will help.

    0 讨论(0)
  • 2021-01-25 00:40

    Try

    public class NoteAdapter extends BaseAdapter {
    
        Context mContext = null;
    
        public NoteAdapter(Context context){
           mContext = context;
        }
    
    
        @Override
        public View getView(int whichItem, View view, ViewGroup viewGroup){
    
            // check if view has been inflated already
            if (view == null){
                LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); // ERROR HERE
    
                view = inflater.inflate(R.layout.listitem, viewGroup, false);
    
            }
    
            return view;
        }
    
    }
    
    0 讨论(0)
  • 2021-01-25 00:41

    The best way to get a LayoutInflater is by calling getLayoutInflater() on an Activity. That way, the activity's theme is taken into account. If NoteAdapter is defined inside of an Activity, just call getLayoutInflater(). If NoteAdapter is defined in its own separate Java class file, pass in a LayoutInflater via the constructor.

    To more directly address your question, any View, like ListView, can call getContext() to get a Context. That is where getSystemService() is defined. So, replacing getSystemService() with viewGroup.getContext().getSystemService() would work.

    0 讨论(0)
  • 2021-01-25 00:41

    First make the constructor of Adapter: like follow :

    Context context;
    public NoteAdapter(Context context)
    {
      this.context = context
    }    
    

    Now use this context:

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
    0 讨论(0)
  • 2021-01-25 00:42

    In my views, if you are learning then learn RecyclerView. bcz it is better than ListView. i am not saying that ListView has been depricated. But there alot of internal things in which RecyclerView is better.

    Following is example of Adapter

    public class NoteAdapter extends BaseAdapter {
    
        List<Note> mNoteList = new ArrayList<Note>();
    
        Context context;
    
        public NoteAdapter(Context context){
            this.context = context;
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    
        }
    
        @Override
        public int getCount(){
            return mNoteList.size();
        }
    
        @Override
        public Note getItem(int whichItem){
            return mNoteList.get(whichItem);
        }
    
        @Override
        public long getItemId(int whichItem){
            return whichItem;
        }
    
        @Override
        public View getView(int whichItem, View view, ViewGroup viewGroup){
    
            // check if view has been inflated already 
            if (view == null){
    
                view = inflater.inflate(R.layout.listitem, viewGroup, false);
    
            }
    
            return view;
        }
    
    } 
    

    Inside MainActivity.java

    NoteAdapter noteA = new NoteAdapter(MainActivity.this);
    

    OR

    NoteAdapter noteA = new NoteAdapter(getContext());
    

    OR

    NoteAdapter noteA = new NoteAdapter(getActivity);

    // if in Fragment

    OR

    NoteAdapter noteA = new NoteAdapter(getApplicationContext);

    // will work but no need to use it. bcz this is context of whole application. For an adapter you don't need context of whole application.

    0 讨论(0)
提交回复
热议问题