【问题标题】:Search Row/Record From Android Room database by search view widget, But When I click after search , It's provide incorrect Position通过搜索视图小部件从 Android Room 数据库中搜索行/记录,但是当我在搜索后单击时,它提供的位置不正确
【发布时间】:2022-10-21 00:25:22
【问题描述】:

它工作正常,但是当我通过搜索视图搜索某些内容时,它按搜索关键字显示结果,工作正常。当我单击搜索结果时,它显示的位置不正确。有什么解决办法吗?我从一个星期开始就在尝试这个东西。

主要活动

  searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        final List<ModelClass>filteredList = new ArrayList<>();
        @Override
        public boolean onQueryTextSubmit(String query) {
            if (query!=null){
                getItemFromDb(query);
            }
            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            if (newText!=null){
                getItemFromDb(newText);
            }else {
                //when search view is empty then set all data to the adapter class
                noteAdapter.setList(listData);
            }
            return true;
        }
    });



    private void getItemFromDb(String query){
    String searchText = "%"+query+"%";
    final List<ModelClass>myList = new ArrayList<>(); //now it is empty
    LiveData<List<ModelClass>>listLiveData = viewModel.getSearchData(searchText);

    listLiveData.observe(this, new Observer<List<ModelClass>>() {
        @Override
        public void onChanged(List<ModelClass> modelClasses) {
            myList.addAll(modelClasses);
            noteAdapter.setList(myList);
            recyclerView.setAdapter(noteAdapter);

        }
    });
}

道接口

@Dao
public interface NoteDao {

@Insert
void insert(ModelClass modelClass);

@Delete
void delete(ModelClass modelClass);

@Update
void update(ModelClass modelClass);

@Query("SELECT * FROM myNewNote")
LiveData<List<ModelClass>>getAllNote();



@Query("SELECT * FROM myNewNote WHERE title LIKE ( :searchQuery) ORDER BY id")
LiveData<List<ModelClass>> getSearchDatabase(final String searchQuery);

【问题讨论】:

  • 你能分享一下你遇到的问题的截图吗?另外,为什么要将 recyclerview.setAdapter() 放在 livedata 观察的 onChanged 中。只需将其移至您在活动的 onCreate 中某处创建适配器对象的位置。这可能会解决您的问题
  • 无法解决您的解决方案,我可以给您发送视频吗,这是一个屏幕录像机。

标签: android android-studio


【解决方案1】:

最初您通过 Log 从 Db 中检查记录`

    listLiveData.observe(this, new Observer<List<ModelClass>>() {
    @Override
    public void onChanged(List<ModelClass> modelClasses) {
        myList.addAll(modelClasses);
        noteAdapter.setList(myList);
        recyclerView.setAdapter(noteAdapter);

        Log.e("List = ", list.toString())



    }
});`

在适配器中实现这些代码行

fun getNoteAt(position: Int) = items[position]

override fun onBindViewHolder(holder: CharacterViewHolder, position: Int) =
    holder.bind(items[position])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多