0

I am aware that there are plenty of similar questions, but they all have in common, that their solutions dont work with my list :(

I am trying to get my userList refreshing itself via the custom ArrayAdapter, when the database-contents are changed. In my case when i reset();

here my snippets (partial code): 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();
            } });

and here 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 is just a simple object-class. think its not the troublemaker here!

any help is appreciated!!! thx :-)

4

2 に答える 2

3

データベースの内容が変更されたときに、カスタム ArrayAdapter を介して userList を更新しようとしています。

データベースのデータを更新するときに CursorAdapter ではなく ArrayAdapter を使用しているため、アダプターはそれ自体を更新しません。ListView を更新するときはいつでも、アダプターに新しいデータソースを提供する必要があります。

考えられる解決策の 1 つは、アダプターのデータソースを変更するアダプター サブクラスでセッターを作成することです。

擬似コード:

/* setter in adapter subclass */
public void changeDataSource(ArrayList<User> newUserList) {
   this.userList = newUserList;
}

次にadapter.notifyDataSetChanged();ListView更新を呼び出します。

于 2013-03-20T15:33:14.633 に答える
1

これを試して:

arrayAdapter.clear()
for(Object o : objects)
  arrayAdapter.add(o)

clear()そして自分自身をadd()呼び出しnotifyDataSetChanged()ます。

于 2013-03-20T22:25:07.673 に答える