Skip to content

How to Filter Data in RxJava in Android

This is the Json data that i need to filter.

{
    "id": 1,
    "game_name": "Bắn cá 2021",
    "game_menu": "Lời khuyên",
    "subtitle": "Sử dụng chiến thuật ria đạn",
    "description": "Chiến lược này phù hợp cho người mới bắt đầu. Để tiết kiệm đạn và tăng khả năng chiến thắng, bạn nên tiêu diệt cá nhỏ. Đây là một trong những cách chơi nổi tiếng. Nhiều người chơi bỏ qua những con cá nhỏ này và luôn nhìn vào những con cá lớn. Thật là sai lầm! Đối với người mới bắt đầu, đây không phải là một cách hay. Nếu bạn áp dụng lối suy nghĩ giống như những người chơi khác, bạn chắc chắn sẽ mất hết vốn!",
    "image": null
},
{
    "id": 2,
    "game_name": "Bắn cá 2021",
    "game_menu": "Lời khuyên",
    "subtitle": "Bắn cá ngay khi chúng xuất hiện",
    "description": "Khi nó xuất hiện, hãy nhắm ngay lập tức. Bằng cách này, bạn chắc chắn sẽ nhận được nhiều xu thay vì bắn theo được những con cá lớn.",
    "image": null
},{
    "id": 9,
    "game_name": "Săn Cá Mập ",
    "game_menu": "Lời khuyên",
    "subtitle": "Những Điều Cần Lưu Ý Khi Chơi Game Bàn Cá Trực Tuyến",
    "description": "1. Game bắn cá ăn tiền thật trực tuyến dựa trên giao diện đẹp, bắt mắt, nhạc nền sống động, màu sắc tươi sáng và sử dụng đồ họa 3D tinh tế, hình ảnh sắc nét. Người chơi sẽ trở thành một xạ thủ thực hiện chuyến đi săn dưới lòng đại dương sau khi tham gia.",
    "image": null
},
{
    "id": 10,
    "game_name": "Săn Cá Mập ",
    "game_menu": "Lời khuyên",
    "subtitle": "Những Điều Cần Lưu Ý Khi Chơi Game Bàn Cá Trực Tuyến",
    "description": "2 . Vũ khí của bạn là một khẩu súng để giết cá. Sau khi bắn hạ, mỗi con cá khác nhau sẽ cho bạn một số xu nhất định.",
    "image": null
},
{
    "id": 11,
    "game_name": "Săn Cá Mập ",
    "game_menu": "Lời khuyên",
    "subtitle": "Những Điều Cần Lưu Ý Khi Chơi Game Bàn Cá Trực Tuyến",
    "description": "3: Người chơi cần bỏ ra một số tiền để có thể mua đạn để bắn và đổi lại khi bạn có vũ khí trong tay thì việc bắn cá sẽ trở nên đơn giản hơn. Dễ bắn và khả năng kiếm được tiền sẽ cao hơn trông thấy.",
    "image": null
}

This my “ViewModel” Class

public class TipsViewModel extends ViewModel {


private static final String TAG = "TipsViewModel";

private Repository repository;
private MutableLiveData<List<TipsModel>> tipsList = new MutableLiveData<>();


@ViewModelInject
public TipsViewModel(Repository repository){
    this.repository = repository;
}


public MutableLiveData<List<TipsModel>> getTipsList(){
    return tipsList;
}




//This function is where i want to filter the data from json.
public void getTips(){
    repository.getTips()
            .flatMap(Observable::fromIterable)
            .filter(result -> result.getGameName().equals("Bắn cá 2021"))
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(result -> tipsList.setValue(result),
                    error -> Log.e(TAG,"getTips: "+ tipsList.toString()));
}
}

I want to filter the data that i’m getting from json. I only what to display all the data that contains “Bắn cá 2021” using the “game_name” attribute. The “getTips” function that i made have some error.

E/TipsViewModel: getTips: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

This is my first time to use rxjava in android.

Answer

You can see what is going on in your stream using doOnNext method or forEach or something similar:

public void getTips(){
    repository.getTips()
            .flatMap(Observable::fromIterable)
            //check if e.getGameName() is not null
            .doOnNext(e->System.out.println(e.getGameName())) 
            .filter(result -> result.getGameName().equals("Bắn cá 2021"))
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(result -> tipsList.setValue(result),
                    error -> Log.e(TAG,"getTips: "+ tipsList.toString()));
}

Or you can change the comparison if you are expecting null gameName values:

.filter(result -> "Bắn cá 2021".equals(result.getGameName()))