0

У меня есть 1 ArrayList и 1 RecyclerView. Данные из БД извлекаются и сохраняются в ArrayList для отображения в RecyclerView. Все отлично работает с добавлением нового элемента в RecyclerView, но без добавления анимации. Я знаю, что я должен использовать notifyItemInserted для добавления анимации, но это не сработало. Не появлялась анимация вставки. Теперь мне нужно вернуться на предыдущую страницу, а затем снова вернуться на страницу, чтобы отображался добавленный элемент. Итак, как добавить обратно вставку анимации?NotifyItemInserted RecyclierView не работает с arrayList

Любая помощь будет очень оценена. Благодарю.

Код для передачи данных и установить адаптер:

db = new DatabaseHelper(this); 
    dbList = new ArrayList<>(); 
    dbList = db.getFilteredItems(); 

    RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
    mRecyclerView.setHasFixedSize(true); 
    LinearLayoutManager llm = new LinearLayoutManager(this); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 

    //newest to oldest order (database stores from oldest to newest) 
    llm.setReverseLayout(true); 
    llm.setStackFromEnd(true); 

    mRecyclerView.setLayoutManager(llm); 
    mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 

    adapter = new RecyclerAdapter(this, llm, dbList); 
    mRecyclerView.setAdapter(adapter); 

код для извлечения данных из БД:

//retrieve filtered data from DB 
public List<AudioItem> getFilteredItems(){ 
    List<AudioItem> audioList = new ArrayList<>(); 
    String titleName = EditActivity.titleName; 
    String query = "select * from " + TABLE_NAME + " where " + COLUMN_NAME_RECORDING_NAME + " like '" + titleName + "%'"; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(query,null); 

    if (cursor.moveToFirst()){ 
     do { 
      AudioItem audio = new AudioItem(); 
      audio.setId(Integer.parseInt(cursor.getString(0))); 
      audio.setName(cursor.getString(1)); 
      audio.setFilePath(cursor.getString(2)); 
      audio.setLength(Integer.parseInt(cursor.getString(3))); 
      audio.setTime(Long.parseLong(cursor.getString(4))); 
      audioList.add(audio); 

     }while (cursor.moveToNext()); 
     cursor.close(); 
    } 

    return audioList; 
} 

Код для вставки данных в БД:

/* Insert data into database */ 
public void addRecording(String recordingName, String filePath, long length) { 

    SQLiteDatabase db = getWritableDatabase(); 
    ContentValues cv = new ContentValues(); 
    cv.put(COLUMN_NAME_RECORDING_NAME, recordingName); 
    cv.put(COLUMN_NAME_RECORDING_FILE_PATH, filePath); 
    cv.put(COLUMN_NAME_RECORDING_LENGTH, length); 
    cv.put(COLUMN_NAME_TIME_ADDED, System.currentTimeMillis()); 
    db.insert(TABLE_NAME, null, cv); 
    db.close(); 

    if (mOnDatabaseChangedListener != null) { 
     mOnDatabaseChangedListener.onNewDatabaseEntryAdded(); 
    } 
} 

Код для вызова анимации вставки:

@Override 
public void onNewDatabaseEntryAdded() { 
    //item added to top of the list 
    Log.e("Count: ", Integer.toString(getItemCount())); 
    // notifyDataSetChanged(); 
    notifyItemInserted(getItemCount()); 
    //llm.scrollToPosition(getItemCount() - 1); 
} 
+0

Некоторые коды помогут нам помочь. – nukeforum

+0

Добавлены фрагменты кода nukeforum. Спасибо –

+0

@KenWong, почему вы используете 2 arraylist, когда вы можете сделать это с помощью одного arraylist, вы можете передать имя title как параметр в методе getDataFromDB, а затем, выполнив такой же запрос, вы можете получить данные и вернуть их – Vickyexpert

ответ

0

Если вы делаете новый ArrayList каждый раз, когда что-то меняется и назначает его новому адаптеру и назначает этот новый адаптер RecyclerView, случаются случайные вещи.

Вы должны разбить ArrayList s на тип модели объекта или интегрировать их в ваш текущий объект модели DB. Если вы это сделаете, вы можете просто обновить itemlist, и изменения будут отражены в вашем RecyclerView.

Вот некоторые псевдо-код, так как я на самом деле не много кода, чтобы отрабатывать:

public class DataModel { 
    private ArrayList<Foo> itemlist = new ArrayList<>(); 

    public DataModel(){} 
    public ArrayList<Foo> getItemList() { return itemlist; } 
} 

public class YourActivity extends Activity { 
    private DataModel data = new DataModel(); 

    @Override 
    protected void onCreate(Bundle b) { 
    if (b == null) { 
     RecyclerView dataView = (RecyclerView) findViewById(R.id.recyclerView); 
     dataView.setAdapter(new RecyclerAdapter(this, new LinearLayoutManager(this), data.getItemList())); 
    } 
    } 
} 

После того, как вы установили вещи таким образом, всякий раз, когда вы обновляете itemlist, вы должны видеть изменения автоматически отображается. Если нет, позвоните notifyDataSetChanged().

+0

Спасибо за ваш ответ, но у меня есть 2 ArrayList. Один (dbList) используется для извлечения всех данных, хранящихся в БД, а другой (itemList) используется для фильтрации некоторых элементов в dbList.Я действительно не понимаю, как это работает и как его реализовать. Не могли бы вы объяснить более подробно? Большое вам спасибо. Я обновлю код в БД. –

Смежные вопросы