Java 保存临时arraylist以在适配器中使用
我有个问题。 在删除某些元素之前,我需要保存一个Java 保存临时arraylist以在适配器中使用,java,android,arraylist,android-adapter,Java,Android,Arraylist,Android Adapter,我有个问题。 在删除某些元素之前,我需要保存一个ArrayList。 因此,我使用附加的“users opied”ArrayList和“users”ArrayList的副本。 但它不起作用,我现在不知道为什么。 删除“users”ArrayList中的某些元素后,该操作也会影响“usersCopied”ArrayList。 如何解决这个问题? 我想保存初始列表,而不是更改它,我将使用该列表恢复初始数据。 谢谢 公共类SelectUser扩展了ActionBarActivity实现了View.On
ArrayList
。
因此,我使用附加的“users opied”ArrayList
和“users”ArrayList的副本。
但它不起作用,我现在不知道为什么。
删除“users”ArrayList
中的某些元素后,该操作也会影响“usersCopied”ArrayList
。
如何解决这个问题?
我想保存初始列表,而不是更改它,我将使用该列表恢复初始数据。
谢谢
公共类SelectUser扩展了ActionBarActivity实现了View.OnClickListener{
公共静态ArrayList用户;
publicstaticarraylistuserscopied;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
users=newarraylist();
//用户列表的副本,未更改
usersCopied=null;
mCallback=新建LoaderManager.LoaderCallbacks(){
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
progressDialog.show();
返回新的GetUser(getApplicationContext());
}
@凌驾
public void onLoadFinished(加载程序、ArrayList数据){
用户=数据;
适配器=新的MyListAdapter(用户);
setAdapter(适配器);
//复制数据
if(usersCopied==null){
Log.d(Constants.tag,“未复制!”);
copyData(数据);
}否则
{
Log.d(Constants.tag,“已复制!”);
}
}
};
getSupportLoaderManager();
}
公共void copyData(ArrayList数据){
usersCopied=newarraylist(数据);
}
公共类MyListAdapter扩展了BaseAdapter{
ArrayList用户;
公共MyListAdapter(ArrayList用户){
this.users=用户;
}
@凌驾
public void notifyDataSetChanged(){
super.notifyDataSetChanged();
//这里有个问题
//从“用户”列表中删除项目后,列表中的“UsersCopy”也删除了该元素。为什么?
Log.d(Constants.tag、String.valueOf(“MyListAdapter users.size:+users.size());
Log.d(Constants.tag、String.valueOf(“MyListAdapter usersCopied.size:+usersCopied.size());
}
}
@凌驾
公共void onClick(视图v){
开关(v.getId()){
案例R.id.B传感器:
sortData();
打破
}
}
//我只想删除列表用户中的元素
//从“UserCopy”列表还原初始数据
//以及从“用户”列表中删除
公共无效排序数据(){
adapter.users=usersCopied;
适配器。用户。删除(0);
adapter.notifyDataSetChanged();
}
}
好吧,我也遇到过同样的问题。
1.尝试创建另一个临时arraylist。
2.临时数据=数据;
3.然后执行users.addall(列表)
希望这有帮助。尝试使用
Collections.copy(目标、源)代码>现在您仍在引用用户数据。
为确保不再引用,请更改copyData方法:
public void copyData(ArrayList<com.taxizauglom.utils.User> data) {
usersCopied = new ArrayList<com.taxizauglom.utils.User>();
for (User user : data){
//Use the data from this loop's user to create a new one.
usersCopied.add(new User(....));
}
}
public void copyData(ArrayList数据){
usersCopied=newarraylist();
for(用户:数据){
//使用此循环用户的数据创建一个新循环。
usersCopied.add(新用户(..);
}
}
这似乎是不必要的,但除非您创建新的用户对象,否则您将保持引用的灵活性。试试这个
创建新的数组列表,并使用addAll方法将元素从原始arraylist复制到新的arraylist。这将解决您的问题
public void copyData(ArrayList<com.taxizauglom.utils.User> data) {
usersCopied = new ArrayList<com.taxizauglom.utils.User>();
usersCopied.addAll(data);
}
public void copyData(ArrayList数据){
usersCopied=newarraylist();
usersCopied.addAll(数据);
}
为要保存的项目创建一个单独的类
e、 你想省钱吗
1)ID
2) 名字
3) 学校
而不是创建一个类
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
,其类型为ShowItems
,如下所示
ArrayList<ShowItems> products = new ArrayList<ShowItems>();
如果您想在某个位置获取数据,请像
String strID = products.get(position).ID;
String strNAME = products.get(position).NAME;
String strSCHOOL = products.get(position).SCHOOL;
是否要删除特定位置的项目。。。?
这样做没问题
products.remove(position);
谢谢你的建议!
我发现了一个麻烦
就在那里:
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();
}
public void sortData(){
//这里我指的是临时列表,并且一直在更改它。
adapter.users=usersCopied;
//而不是我不得不使用这个:
adapter.users=new ArrayList(usersCopied);
适配器。用户。删除(0);
adapter.notifyDataSetChanged();
}
您可以只使用作为参数的构造函数collectionnew ArrayList(collection…)
虽然这可能会回答问题,但您应该解释一下为什么此代码会解决OP的问题,而不是只给出代码的答案。只允许使用代码回答,但包括注释和解释将改进它。代码对您来说是自我解释的,我相信,也许是这样,但对OP来说——不一定,这就是为什么首先要问这个问题。请注意,我看到您的答案的唯一原因是其他用户已将其标记为VLQ queue.Collections.copy(destination,source);将进一步优化它。因为你需要迭代你的源代码列表。
products.remove(position);
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();
}