使用自定义ListAdapter更新/刷新List

时间:2013-03-20 15:21:12

标签: android arraylist android-arrayadapter custom-adapter

我知道有很多类似的问题,但它们都有共同点,他们的解决方案不适用于我的列表:(

当数据库内容发生变化时,我试图让我的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: - )

2 个答案:

答案 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()本身。