我正在尝试编写代码(世界永远不会知道:D),当我试图更新listview时,我只是收到错误....
理论上的代码:"当我点击NavDrawer中的项目时,listView应该填充特定数据"
现实中的代码:
public class MainActivity extends AppCompatActivity {
ArrayAdapter<String> adapter;
String[] values;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listview = (ListView) findViewById(R.id.listview);
values = new String[]{"Android", "iPhone", "WindowsMobile",
"Blackberry", "WebOS", "Ubuntu", "Windows7"};
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values);
listview.setAdapter(adapter);
}
public void update(){
adapter.clear();
adapter.notifyDataSetChanged();
}
从NavDrawerFragment.java中存在的此方法调用该方法
@Override
public void itemClicked(View view, int position) {
Toast.makeText(getActivity(), "shit is going down", Toast.LENGTH_LONG).show();
new MainActivity().update();
}
我猜它正在发生,因为我正在创建一个新对象,但我只是(在键入帖子的中间)传递适配器作为方法参数(你可以将其作为一个setter inma)和在itemClicked方法中我输入了适配器.clear()和同样的事情发生了
好吧,我使用setter改变了值varible
public void setValues(String[] values) {
this.values = values;
adapter.notifyDataSetChanged();
}
我从recyclerview(存在于抽屉中)适配器中调用它
String values[] = {"lel", "uja"};
mainActivity.setValues(values);
所以同样崩溃,maybile som1想上skype电话?我保证,我不会讨厌
显然我毕竟是在创造另一个对象:
MainActivity mainActivity = new MainActivity();
我想知道为什么我可以像这样访问这个方法:
mainActivity.setValues(values);
所以我可能要问的是:如何在不创建活动的情况下访问方法?
答案 0 :(得分:1)
对于ArrayAdapter,只有在适配器上使用add()
,insert()
,remove()
和clear()
时,notifyDataSetChanged才有效。
构建ArrayAdapter
时,它会保留传入的List
的引用。如果要传入属于Activity
成员的List,并且稍后更改该活动成员,ArrayAdapter
仍然保留对原始列表的引用。适配器不知道您更改了活动中的列表。
@Override
public void itemClicked(View view, int position) {
//filter your list i.e `values` based on on item click,clearing it and adding new values
adapter.notifyDataSetChanged();
}