簡體   English   中英

通過 Java 在 Room 中使用 SearchView

[英]Using SearchView with Room by Java

你好嗎,希望你一切都好——我正在使用 Room 庫將產品存儲在 RecyclerView 中。 - 使用 SearchView 按名稱搜索產品時,僅在輸入首字母時出現產品名稱(即 SearchView 僅與產品名稱的首字母交互)。 此外,當您刪除該字母時,完整的產品列表不會再次出現。 請幫我找出代碼中的錯誤 熱烈的問候,藝術家

dependencies

    implementation "android.arch.persistence.room:runtime:1.1.1"
    annotationProcessor "android.arch.persistence.room:compiler:1.1.1"

    implementation "android.arch.lifecycle:extensions:1.1.1"
    //noinspection LifecycleAnnotationProcessorWithJava8
    annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

ProductEntry

    @Entity(tableName = "product")
public class ProductEntry {

    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name = "productName")
    private final String productName;

    private final String productBarcode, productQuantity
            , productPurchasingPrice, productSellingPrice, productDescription, productCategory;

    @Ignore
    public ProductEntry(String productName, String productBarcode, String productQuantity
            , String productPurchasingPrice, String productSellingPrice, String productDescription, String productCategory) {
        this.productName = productName;
        this.productBarcode = productBarcode;
        this.productQuantity = productQuantity;
        this.productPurchasingPrice = productPurchasingPrice;
        this.productSellingPrice = productSellingPrice;
        this.productDescription = productDescription;
        this.productCategory = productCategory;
    }

    public ProductEntry(int id, String productName, String productBarcode, String productQuantity
            , String productPurchasingPrice, String productSellingPrice, String productDescription, String productCategory) {
        this.id = id;
        this.productName = productName;
        this.productBarcode = productBarcode;
        this.productQuantity = productQuantity;
        this.productPurchasingPrice = productPurchasingPrice;
        this.productSellingPrice = productSellingPrice;
        this.productDescription = productDescription;
        this.productCategory = productCategory;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getProductName() {
        return productName;
    }

    public String getProductBarcode() {
        return productBarcode;
    }

    public String getProductQuantity() {
        return productQuantity;
    }

    public String getProductPurchasingPrice() {
        return productPurchasingPrice;
    }

    public String getProductSellingPrice() {
        return productSellingPrice;
    }

    public String getProductDescription() {
        return productDescription;
    }

    public String getProductCategory() {
        return productCategory;
    }

}

ProductDao 

@Dao
public interface ProductDao {

    @Query("SELECT * FROM product ORDER BY id")
    LiveData<List<ProductEntry>> loadAllTasks();

    @Query("SELECT * FROM product WHERE id = :id")
    LiveData<ProductEntry> loadTaskById(int id);

    @Query("SELECT * FROM product WHERE productName LIKE :findProductName")
    LiveData<List<ProductEntry>> findProduct(String findProductName);

    @Insert
    void insertTask(ProductEntry productEntry);

    @Update(onConflict = OnConflictStrategy.REPLACE)
    void updateTask(ProductEntry productEntry);

    @Delete
    void deleteTask(ProductEntry productEntry);

}

FindProductViewModel 

    public class FindProductViewModel extends ViewModel {

    private final LiveData<List<ProductEntry>> findProduct;

    public FindProductViewModel(AppDatabase database, String searchQuery) {
        findProduct = database.productDao().findProduct(searchQuery);
    }

    public LiveData<List<ProductEntry>> getFindProduct() {
        return findProduct;
    }

}

FindProductViewModelFactory

    public class FindProductViewModelFactory extends ViewModelProvider.NewInstanceFactory {

    private final AppDatabase mDb;
    private final String mProductQuery;

    public FindProductViewModelFactory(AppDatabase database, String productQuery) {
        mDb = database;
        mProductQuery = productQuery;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        //noinspection unchecked
        return (T) new FindProductViewModel(mDb, mProductQuery);
    }
}


ProductsActivity

    public class ProductsActivity extends AppCompatActivity implements ProductAdapter.ItemClickListener {

    private FloatingActionButton fabAddProduct;

    private RecyclerView recyclerView;

    private ProductAdapter productAdapter;

    private AppDatabase mDb;

    private View emptyView;

    private SearchView productSearchView;

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

        initView();

        setupViewModel();

        setupRecycleView();

        fabAddProduct.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent addProductIntent = new Intent(ProductsActivity.this, AddProductActivity.class);
                startActivity(addProductIntent);
            }
        });

        productSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                getItemFromDb(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                getItemFromDb(newText);
//                productAdapter.getFilter().filter(newText);
                return false;
            }
        });

    }

    private void getItemFromDb(String query) {
        String searchText = "%" + query + "%";

        FindProductViewModelFactory factory = new FindProductViewModelFactory(mDb, searchText);

        final FindProductViewModel viewModel = ViewModelProviders
                .of(ProductsActivity.this, (ViewModelProvider.Factory) factory)
                .get(FindProductViewModel.class);

        viewModel.getFindProduct().observe(this, new Observer<List<ProductEntry>>() {
            @Override
            public void onChanged(@Nullable List<ProductEntry> productEntries) {
                viewModel.getFindProduct().removeObserver(this);
                productAdapter.setProductEntries(productEntries);
            }
        });

    }

    private void initView() {
        emptyView = findViewById(R.id.empty_view);
        fabAddProduct = findViewById(R.id.fabAddProducts);
        recyclerView = findViewById(R.id.recyclerViewProducts);
        productSearchView = findViewById(R.id.productSearchView);
    }

    private void setupRecycleView() {
        mDb = AppDatabase.getInstance(getApplicationContext());
        productAdapter = new ProductAdapter(this, this, mDb);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(productAdapter);
    }

    private void setupViewModel() {
        MainViewModel viewModel = ViewModelProviders.of(this).get(MainViewModel.class);

        viewModel.getProducts().observe(this, new Observer<List<ProductEntry>>() {
            @Override
            public void onChanged(@Nullable List<ProductEntry> productEntries) {
                productAdapter.setProductEntries(productEntries);

                if (productAdapter.getItemCount() == 0) {
                    recyclerView.setVisibility(View.GONE);
                    emptyView.setVisibility(View.VISIBLE);
                    productSearchView.setVisibility(View.GONE);
                } else {
                    recyclerView.setVisibility(View.VISIBLE);
                    emptyView.setVisibility(View.GONE);
                    productSearchView.setVisibility(View.VISIBLE);
                }

            }
        });
    }

    @Override
    public void onItemClickListener(int itemId) {

        Intent intent = new Intent(ProductsActivity.this, AddProductActivity.class);
        intent.putExtra(AddProductActivity.EXTRA_PRODUCT_ID, itemId);
        startActivity(intent);
    }
}

給你一個簡單的答案,你只得到第一次更新的原因是viewModel.getFindProduct().removeObserver(this);

非常感謝你

我通過添加以下代碼解決了問題

 package com.artist.bookkeeper.activities;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.artist.bookkeeper.database.entry.ProductEntry;
import com.artist.bookkeeper.viewmodel.MainViewModel;
import com.artist.bookkeeper.adapters.ProductsAdapter;
import com.artist.bookkeeper.R;
import com.artist.bookkeeper.database.AppDatabase;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.ArrayList;
import java.util.List;

public class ProductStoreActivity extends AppCompatActivity implements ProductsAdapter.ItemClickListener {

    private FloatingActionButton addProductFab;

    private RecyclerView productsRv;

    private ProductsAdapter productsAdapter;

    private AppDatabase appDatabase;

    private View productsEmptyView;

    private SearchView productsSv;

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

        initProductView();

        setupProductViewModel();

        setupProductRecycleView();

        addProductFab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(ProductStoreActivity.this, AddProductActivity.class));
            }
        });

        productsSv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                setupProductViewModel();
                productsFilter(newText);
                return true;
            }
        });

    }

    private void productsFilter(String text) {
        ArrayList<ProductEntry> productsList = new ArrayList<>();
        for (ProductEntry product : productsAdapter.getProductEntries()) {
            if (product.getProductName().toLowerCase().contains(text.toLowerCase())) {
                productsList.add(product);
            }
        }
        if (productsList.isEmpty()) {
            Toast.makeText(this, getString(R.string.no_product), Toast.LENGTH_SHORT).show();
        } else {
            productsAdapter.setProductEntries(productsList);
        }
    }

    private void initProductView() {
        productsEmptyView = findViewById(R.id.productEmptyView);
        addProductFab = findViewById(R.id.addProductFab);
        productsRv = findViewById(R.id.productRv);
        productsSv = findViewById(R.id.productSv);
    }

    private void setupProductRecycleView() {
        appDatabase = AppDatabase.getInstance(getApplicationContext());
        productsAdapter = new ProductsAdapter(this, this, appDatabase);
        productsRv.setHasFixedSize(true);
        productsRv.setLayoutManager(new LinearLayoutManager(this));
        productsRv.setAdapter(productsAdapter);
    }

    private void setupProductViewModel() {
        MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);

        mainViewModel.getListProductsLiveData().observe(this, new Observer<List<ProductEntry>>() {
            @SuppressLint("NotifyDataSetChanged")
            @Override
            public void onChanged(@Nullable List<ProductEntry> productEntries) {
                productsAdapter.setProductEntries(productEntries);
                productsAdapter.notifyDataSetChanged();

                if (productsAdapter.getItemCount() == 0) {
                    productsRv.setVisibility(View.GONE);
                    productsEmptyView.setVisibility(View.VISIBLE);
                    productsSv.setVisibility(View.GONE);
                } else {
                    productsRv.setVisibility(View.VISIBLE);
                    productsEmptyView.setVisibility(View.GONE);
                    productsSv.setVisibility(View.VISIBLE);
                }

            }
        });
    }

    @Override
    public void onItemClickListener(int productId, String productName) {
        Intent intent = new Intent(ProductStoreActivity.this, ProductDetailsActivity.class);
        intent.putExtra("productId", productId);
        intent.putExtra("productName", productName);
        startActivity(intent);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM