保存临时arraylist以在Adapter中使用

时间:2015-06-22 11:45:59

标签: java android arraylist android-adapter

我有问题。 在我删除一些元素之前,我需要保存ArrayList。 因此我使用额外的"用户选择" ArrayList与"用户"重复数组列表。 但它不起作用,我现在不知道为什么。 删除"用户"中的一些元素后ArrayList,该操作也会影响" usersCopied" ArrayList。 如何摆脱这个问题? 我想保存初始列表,而不是更改它,我将用于恢复初始数据的列表。 谢谢!

public class SelectUser extends ActionBarActivity implements View.OnClickListener {

public static ArrayList<com.taxizauglom.utils.User> users;
public static ArrayList<com.taxizauglom.utils.User> usersCopied;

@Override
protected void onCreate(Bundle savedInstanceState) {

    users = new ArrayList<>();
    // copy of users list, not changing
    usersCopied = null;

    mCallback = new LoaderManager.LoaderCallbacks<ArrayList<com.taxizauglom.utils.User>>() {
        @Override
        public Loader<ArrayList<com.taxizauglom.utils.User>> onCreateLoader(int id, Bundle args) {
            progressDialog.show();
            return new GetUser(getApplicationContext());
        }
        @Override
        public void onLoadFinished(Loader<ArrayList<com.taxizauglom.utils.User>> loader, ArrayList<com.taxizauglom.utils.User> data) {
            users = data;
            adapter = new MyListAdapter(users);
            listUsers.setAdapter(adapter);
            // Copying data
            if (usersCopied == null){
                Log.d(Constants.tag, "Not copied!");
                copyData(data);
            } else
            {
                Log.d(Constants.tag, "Already copied!");
            }
        }
    };

    getSupportLoaderManager().initLoader(1, null, mCallback).forceLoad(); 
}

public void copyData(ArrayList<com.taxizauglom.utils.User> data) {
    usersCopied = new ArrayList<>(data);
}
public class MyListAdapter extends BaseAdapter {

    ArrayList<User> users;

    public MyListAdapter(ArrayList<User> users) {
        this.users = users;
    }
    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
        // here is a problem
        //After removing item from "users" list, in list "usersCopied" also was removed that element. Why?
        Log.d(Constants.tag, String.valueOf("MyListAdapter users.size: " + users.size()));
        Log.d(Constants.tag, String.valueOf("MyListAdapter usersCopied.size: " + usersCopied.size()));
    }

}

@Override
public void onClick(View v) {

    switch (v.getId()) {

        case R.id.btnSort:
            sortData();
            break;
    }
}

// I wanna remove element only in list users
//restoring initial data from "userCopied" list
//and removing from "users" list
public void sortData() {
    adapter.users = usersCopied;
    adapter.users.remove(0);
    adapter.notifyDataSetChanged();
}

}

6 个答案:

答案 0 :(得分:1)

现在你还在引用用户数据。 为了确保您不再引用,请更改copyData方法:

#StayOpen:hover ~ #AccomodationPanel {

         height:300px;

}

似乎没必要,但除非您创建User的新对象,否则您将保持引用。

答案 1 :(得分:0)

好吧我遇到了同样的问题。 1.尝试创建另一个临时arraylist。 2.临时alist =数据; 3.然后执行users.addall(alist)。

希望这有帮助。

答案 2 :(得分:0)

尝试使用Collections.copy(destination, source);

答案 3 :(得分:0)

试试这个

使用方法addAll创建新的数组列表并将元素从原始arraylist复制到新的arleylist,这将解决您的问题。

public void copyData(ArrayList<com.taxizauglom.utils.User> data) {
    usersCopied = new ArrayList<com.taxizauglom.utils.User>();
    usersCopied.addAll(data);
}

答案 4 :(得分:0)

为要保存的项目创建单独的类 例如你想保存

1) ID 2) Name 3) School

而不是创建一个类

public class ShowItems{
    public String ID;
    public String NAME;
    public String SCHOOL;

    public ShowItems(String textID, String textNAME, String textSCHOOL) {
        ID = textID;
        NAME = textNAME;
        SCHOOL = textSCHOOL;
    }   
}

现在创建一个类似ArrayList的{​​{1}}

ShowItems

添加数据

  ArrayList<ShowItems> products = new ArrayList<ShowItems>();

如果您想在某个位置获取数据,请执行

 products.add("1", "MADDY", "CONVENT SCHOOL");

想要删除特定位置的物品......? 没问题就这样....

String strID = products.get(position).ID;
String strNAME = products.get(position).NAME;
String strSCHOOL = products.get(position).SCHOOL;

答案 5 :(得分:0)

感谢您的建议! 我发现了一个麻烦。

就在那里:

public void sortData() {
//Here i refer to temporary list, and change it all the time.
adapter.users = usersCopied;
//Instead of I had to use this:
adapter.users = new ArrayList<>(usersCopied); 
    adapter.users.remove(0);
    adapter.notifyDataSetChanged();
}