【问题标题】:Cannot resolve method 'setAdapter()'无法解析方法“setAdapter()”
【发布时间】:2017-07-25 18:40:47
【问题描述】:

我发现了几个与此类似的问题,但没有一个能解决我的问题。这是我写的代码 -

DataBaseHelper dataBaseHelper;
ArrayAdapter<String> mAdapter;
ListView notesList;

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

    dataBaseHelper = new DataBaseHelper (this);
    notesList = (ListView) findViewById(R.id.notesList);
    loadNotesList ();
}

public void loadNotesList () {
    ArrayList<String> notesList = dataBaseHelper.getNameList();
    if (mAdapter == null) {
        mAdapter = new ArrayAdapter<String>(this, R.layout.row, R.id.note_name, notesList);
        notesList.setAdapter(mAdapter);
    }

    else {
        mAdapter.clear();
        mAdapter.addAll(notesList);
        mAdapter.notifyDataSetChanged();
    }
}

...

我的代码 似乎 就像我正在遵循的教程中的代码一样,我的代码 似乎 就像它在正确的位置,但我知道我错过了某事或做错了什么,因为 Android Studio 给了我这个错误-

Cannot resolve method 'setAdapter(android.widget.ArrayAdapter&lt;java.lang.String&gt;)'

有没有人看到我做错了什么,或者我可能需要添加或更改什么?谢谢!

【问题讨论】:

  • 好吧,ArrayList 没有setAdapter(String) 方法,而notesList 是ArrayList...

标签: java android arrays listview android-arrayadapter


【解决方案1】:

你在loadNotesList函数中引入了局部变量notesList:

ArrayList<String> notesList = dataBaseHelper.getNameList();

将此名称更改为其他名称。

【讨论】:

  • 这准确地回答了我的问题。我只是有冲突的变量,仅此而已。谢谢你,我的男人。
  • @GeorgeB 很高兴为您提供帮助。
【解决方案2】:

您将 ListView 作为最后一个参数传递

mAdapter = new ArrayAdapter<String>(this, R.layout.row, R.id.note_name, notesList);

这是无效的。

【讨论】:

  • 是的。那是因为我有冲突的变量ListView notesList 和ArrayList&lt;String&gt; notesList = dataBaseHelper.getNameList()。我刚刚更改了其中一个变量,它现在可以工作了。
  • 不客气。只需接受答案,其他开发人员就可以从您的问题中受益。
  • @GeorgeB 这不是真的。他将 ArrayList 作为最后一个参数,而不是 ListView。仔细看,他引入了局部变量 notesList。
【解决方案3】:

notesList是一个字符串的ArrayList和一个ListView,你需要改名字。

【讨论】:

    【解决方案4】:

    你已经为ListView声明了一个member变量notesList

    ListView notesList = (ListView) findViewById(R.id.notesList);
    

    另一个是ArrayList of string,它是方法loadNotesList()的local变量

    ArrayList<String> notesList = dataBaseHelper.getNameList();
    

    解决方案:

    您可以使用this 运算符或为两个变量使用不同的名称。

    试试这个:

    DataBaseHelper dataBaseHelper;
    ArrayAdapter<String> mAdapter;
    ArrayList<String> notesList
    
    ListView mListView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        dataBaseHelper = new DataBaseHelper (this);
        mListView = (ListView) findViewById(R.id.notesList);
        loadNotesList ();
    }
    
    public void loadNotesList () {
        notesList = dataBaseHelper.getNameList();
    
        if (mAdapter == null) {
            mAdapter = new ArrayAdapter<String>(this, R.layout.row, R.id.note_name, notesList);
            mListView.setAdapter(mAdapter);
        }
    
        else {
            mAdapter.clear();
            mAdapter.addAll(notesList);
            mAdapter.notifyDataSetChanged();
        }
    }
    
    ...
    

    【讨论】:

      【解决方案5】:

      您在方法(成员变量)之外声明了ListView notesList;,而ArrayList&lt;String&gt; notesList 在loadNotesList()(语言环境变量)内。

      因此,当您尝试在方法内访问notesList 时,Locale 变量将调用(Scope of variables)。

      作为一种解决方案,您可以添加this.notesList(this 关键字来引用类中的实例/成员变量),如下所示:

      mAdapter = new ArrayAdapter<String>(this, R.layout.row, R.id.note_name, this.notesList);//will call member variable
      

      但是,为了简单起见,您可以重命名 notesList 变量名称之一(由您决定)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-15
        • 2015-06-10
        相关资源
        最近更新 更多