小编gig*_*ig6的帖子

拖拽后调用ListAdapter的submitList更新RecyclerView更高效的方式

我正在使用 ItemTouchHelper 类来支持 RecyclerView 中的拖放。我有一个按预期工作的实现,但它似乎效率很低。在我的 onMoved 方法中,我获取列表的当前版本,交换拖动的项目,然后使用新版本的列表调用 SubmitList。问题是,每次发生交换时都会调用 onMoved,并且交换在列表中拖动时会一一执行。因此,如果位置 1 处的项目被拖动到位置 11,则每次交换时都会调用 onMoved (1 -> 2) 、 (2 -> 3) 等。这意味着我获得了列表的新版本,并在拖动完成时调用了 SubmitList 10 次。

我尝试过的:

我尝试在拖动完成后使用更新的列表调用submitList,但它没有改变。我在调用submitList之前记录了适配器的getCurrentList(),它显示了原始的未更改列表(这是预期的)。我已经记录了 MainActivity 的 currentList 变量,它显示了更新的交换列表。我将 currentList 变量传递给submitList,然后记录适配器的 getCurrentList(),它仍然显示原始未更改的列表。我已阅读这篇文章,但建议的解决方案均无效。任何帮助,将不胜感激!

编辑:我还在适配器中使用 DiffUtil。

MainActivity.java

...

private void createItemTouchHelper() {
    new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
        ItemTouchHelper.UP | ItemTouchHelper.DOWN,
        ItemTouchHelper.START | ItemTouchHelper.END) {

    // To track changes when user drags
    List<ListItem> currentList;

    // This method is called when user starts dragging an item
    public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) …
Run Code Online (Sandbox Code Playgroud)

java android android-recyclerview itemtouchhelper android-listadapter

6
推荐指数
0
解决办法
815
查看次数

如何强制 Android 的 Mobile Vision 读取整行文本

我已经按照教程实现了适用于 Android 的 Google Mobile Vision。我正在尝试构建一个应用程序来扫描收据并查找总数。然而,当我扫描以不同格式打印的不同收据时,API 将以似乎任意的方式检测 TextBlock。例如,在一张收据中,如果多个文本单词由单个空格分隔,则它们将被分组到单个 TextBlock 中。但是,如果两个文本单词被大量空格分隔,那么它们将被分隔为独立的 TextBlock,即使它们出现在同一“行”上。我想做的是强制 API 将收据的每一整行识别为单个实体。这可能吗?

text-recognition android-vision

5
推荐指数
1
解决办法
2119
查看次数

插入项目时 RecyclerView 行闪烁/闪烁

每当我将项目插入 Room 数据库时,我的回收器视图都会闪烁包含新插入的视图持有者的行(列表的其余部分不会闪烁)。我正在使用 LiveData 通过在观察到的 ViewModel 方法的 onChanged() 中调用submitList(list)来自动更新我的列表。我的适配器扩展了 ListAdapter,并且我正在使用 DiffUtil 来跟踪列表中的更改。话虽这么说,我不会直接调用 notificationItemInserted(position),因为 DiffUtil 应该为我执行此操作。有两种情况会插入一个项目 (1) 在列表末尾插入一个全新的项目 (2) 将已删除的项目重新插入到列表中。在这两种情况下,该项目都会自行插入然后闪烁。我读过很多帖子,人们建议在回收器视图上禁用动画,但这对我来说不是一个选择,因为我依赖于代码中其他地方的动画。任何其他建议将不胜感激。我试图保持发布的代码简短,但如果有帮助的话我可以发布更多内容。

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initComponents();
    initRecyclerView();
    setListeners();
    setListObserver();
    createItemTouchHelper();
  }

  private void setListObserver() {
    viewModel.getAllItems().observe(this, new Observer<List<ListItem>>() {
      @Override
      public void onChanged(List<ListItem> newList) {
        adapterMain.submitList(newList);
      }
    });
  }

...

// Inserts a new ListItem when MainActivity's EditText is used
  public void onClick(View v) {
    if (v.getId() == R.id.img_add_item_main) …
Run Code Online (Sandbox Code Playgroud)

java android-recyclerview android-room android-livedata android-diffutils

1
推荐指数
1
解决办法
2305
查看次数