RecyclierView的notifyItemInserted不适用于arrayList

时间:2016-07-10 14:30:11

标签: java android arraylist android-recyclerview notifydatasetchanged

我有1个ArrayList和1个RecyclerView。检索来自DB的数据并将其存储在ArrayList中以便在RecyclerView中显示。通过向RecyclerView添加新项目,但没有添加动画,所有工作都可以正常工作。我知道我应该使用notifyItemInserted来添加动画,但它没有用。没有插入动画。现在我必须回到上一页然后再次进入页面,以便显示添加的项目。那么,如何添加插入动画?

非常感谢任何帮助。感谢。

传递数据并设置适配器的代码:

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

从DB检索数据的代码:

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

1 个答案:

答案 0 :(得分:0)

如果每次更改内容时都会创建一个新的ArrayList并将其分配给新的适配器并将该新适配器分配给RecyclerView,那么就会发生不可思议的事情。

您应该将ArrayList分解为Model类型的对象或将它们集成到当前的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()