【问题标题】:RecyclierView's notifyItemInserted does not work with arrayListRecyclierView 的 notifyItemInserted 不适用于 arrayList
【发布时间】:2016-07-10 14:30:11
【问题描述】:

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

从数据库中检索数据的代码:

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

【问题讨论】:

  • 一些代码可以帮助我们帮助您。
  • @nukeforum 代码 sn-ps 添加。谢谢
  • @KenWong,为什么你使用 2 个 arraylist,当你也可以使用单个 arraylist 时,你可以在 getDataFromDB 方法中将 titleName 作为参数传递,然后通过执行类似查询,你可以获取数据并返回它
  • @Vickyexpert 哦,那是我的错误。我现在做了一个ArrayList,但是还是没有RecyclerView的插入动画
  • 更新您的上述代码,以便检查确切的问题并帮助您解决它'

标签: java android arraylist android-recyclerview notifydatasetchanged


【解决方案1】:

如果您每次发生变化时都创建一个新的ArrayList,并将其分配给一个新的适配器,然后将该新的适配器分配给RecyclerView,那么就会发生奇怪的事情。

您应该将ArrayLists 分解为模型类型的对象或将它们集成到您当前的数据库模型对象中。如果您这样做,您只需更新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()

【讨论】:

  • 感谢您的回答。但我有 2 个 ArrayList。一个(dbList)用于检索存储在DB中的所有数据,另一个(itemList)用于过滤dbList中的一些项目。我真的不明白它是如何工作的以及我应该如何实现它。你能更详细地解释一下吗?太感谢了。我将更新数据库中的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 2015-10-17
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多