2015-06-22 2 views
3

У меня проблема. Мне нужно сохранить ArrayList, прежде чем я удалю некоторые элементы. Поэтому я использую дополнительные «пользователи, оперированные» ArrayList с дубликатами «users» ArrayList. Но это не работает, я не знаю почему. После удаления некоторых элементов в «users» ArrayList это действие также влияет на «usersCopied» ArrayList. Как избавиться от этой проблемы? Я хочу сохранить исходный список и не изменять его, этот список я буду использовать для восстановления исходных данных. Спасибо!Сохранение временного arraylist для использования в Adapter

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(); 
} 

} 

ответ

0

В порядке я столкнулся с той же проблемой. 1. Попробуйте создать еще один временный arraylist. 2. временный alist = данные; 3. И затем выполните user.addall (alist).

Надеюсь, что это поможет.

+0

вы можете просто использовать конструктор, который принимает в качестве параметров коллекции 'новый ArrayList (Collection ....)' – SorryForMyEnglish

0

Попробуйте использовать Collections.copy(destination, source);

1

Сейчас вы по-прежнему ссылаясь на данные пользователя. Чтобы убедиться, что вы не ссылки больше, изменить метод 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(....)); 
    } 
} 

Это кажется ненужным, но если вы не создавать новые объекты пользователя, вы будете держать ссылку в такте.

+0

Collections.copy (назначения, источник); будет дополнительно оптимизировать его. По мере необходимости вам нужно перебирать исходный список. –

0

попробовать это

создать новый список массива и скопировать элементы из оригинального ArrayList на новый, используя метод addAll это решит вашу проблему.

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

Хотя это может ответить на вопрос, вы должны включить объяснение, почему этот код решит проблему OP вместо того, чтобы отвечать только на код. Разрешены только коды, но комментарии и объяснения улучшат его. – JNYRanger

+0

Код сам по себе – apk

+0

Для вас и я уверен, может быть, так и есть, но OP - не обязательно, поэтому вопрос задается в первую очередь. Имейте в виду, что единственная причина, по которой я столкнулся с вашим ответом, - это то, что другие пользователи отметили это для очереди VLQ. – JNYRanger

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 с типом 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; 

Wanna удалить пункты в определенном положении ...? Не проблема, как это ....

products.remove(position); 
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(); 
} 
Смежные вопросы