我知道有很多类似的问题,但它们都有共同点,他们的解决方案不适用于我的列表:(
当数据库内容发生变化时,我试图让我的userList通过自定义ArrayAdapter刷新自己。在我的情况下,当我重置();
这里是我的片段(部分代码): MainActivity.java
public class MainActivity extends ListActivity {
private MyUserListAdapter myUserlistAdapter;
public ArrayList<User> myUserList = new ArrayList<User>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//shortened the list-filling. but it works properly!
User user = db.readUser(int);
myUserList.add(user);
myUserlistAdapter = new MyUserListAdapter(this, R.layout.row_main, myUserList);
setListAdapter(myUserlistAdapter);
//now when reset-button is hit, the listview should refresh itself
bReset.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//this is what is posted in most questions, but it does nothing for me
//myUserlistAdapter.notifyDataSetChanged();
//getListView().invalidateViews();
} });
这里是myUserListAdapter.java:
public class MyUserListAdapter extends ArrayAdapter<User>{
private Context context;
private ArrayList<User> userList;
public MyUserListAdapter(Context context,
int textViewResourceId, ArrayList<User> userList) {
super(context, textViewResourceId, userList);
this.context = context;
this.userList = userList;
}
public View getView(int position, View v, ViewGroup parent) {
if (v == null) {
LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.row_main, null);
}
User user = getItem(position);
TextView tvUser = (TextView) v.findViewById(R.id.tvUser);
ImageView ivVoted = (ImageView) v.findViewById(R.id.ivVoted);
tvUser.setText(user.getName());
//abfrage ob hasVoted() = true muss noch eingebaut werden.
if (user.getVoted().equals("1"))
ivVoted.setImageResource(R.drawable.redcheck);
else
ivVoted.setImageResource(R.drawable.greencheck);
return v;
}
}
User.java只是一个简单的对象类。认为这不是麻烦制造者!
任何帮助表示赞赏!!! thx: - )
答案 0 :(得分:3)
我试图让我的userList通过自定义刷新自己 ArrayAdapter,当数据库内容被更改时。
由于在更新数据库中的数据时使用的是ArrayAdapter而不是CursorAdapter,因此适配器不会自行刷新。每当您想要更新ListView时,您需要为Adapter提供新的数据源。
一种可能的解决方案是在适配器子类中创建将改变适配器数据源的setter。
伪码:
/* setter in adapter subclass */
public void changeDataSource(ArrayList<User> newUserList) {
this.userList = newUserList;
}
然后致电adapter.notifyDataSetChanged();
进行ListView
更新。
答案 1 :(得分:1)
试试这个:
arrayAdapter.clear()
for(Object o : objects)
arrayAdapter.add(o)
clear()
和add()
致电notifyDataSetChanged()
本身。