我的应用程序允许Users创建Charts,它们存储在Firestore数据库中,如下所示:
charts
> documentKey1
> description = "Example description"
> name = "Chart name 1"
> uId = user1Id_string
> documentKey2
> description = "Another example description"
> name = "Chart name 2"
> uId = user2Id_string
> documentKey3
> description = "Example description again"
> name = "Chart name 3"
> uId = user1Id_string每个用户可以有多个图表。目前,我的MainActivity从数据库中检索当前用户的所有图表,按给定的顺序(由用户设置)对它们进行排序,并在片段中的FirebaseRecyclerView中显示它们。
在ViewPager中,MainActivity有2个片段。相关的一个是FragmentMyCharts,它包含:
public class FragmentMyCharts extends FragmentChartsList {
public FragmentMyCharts() {}
public Query getQuery(FirebaseFirestore databaseReference,
String orderBy,
Query.Direction direction) {
// Specify the query which is used to retrieve this user's charts
return databaseReference.collection("charts")
.whereEqualTo("uid", getUid())
.orderBy(orderBy, direction);
}
}这是对FragmentChartsList的扩展,如下所示:
public abstract class FragmentChartsList extends Fragment {
private FirebaseFirestore mDatabaseRef;
private ChartListAdapter mAdapter;
private RecyclerView mRecycler;
private String mOrder = "name", mFilter;
private Query.Direction mDirection = Query.Direction.DESCENDING;
private TextView mLoadingList, mEmptyList;
public FragmentChartsList() {}
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
// Inflate layout, and find Recycler View which will hold the list
View rootView = inflater.inflate(
R.layout.fragment_charts_list, container, false);
mRecycler = rootView.findViewById(R.id.charts_list);
mRecycler.setHasFixedSize(true);
mLoadingList = rootView.findViewById(R.id.loading_list);
mEmptyList = rootView.findViewById(R.id.empty_list);
// Set up Layout Manager, and set Recycler View to use it
LinearLayoutManager mManager = new LinearLayoutManager(getActivity());
mManager.setReverseLayout(true);
mManager.setStackFromEnd(true);
mRecycler.setLayoutManager(mManager);
// Connect to the database
mDatabaseRef = FirebaseFirestore.getInstance();
setOrderAndFilter(mOrder, mDirection, mFilter);
return rootView;
}
public abstract Query getQuery(FirebaseFirestore databaseReference,
String orderBy,
Query.Direction direction);
public void setOrderAndFilter(String order, Query.Direction direction, String filterString) {
mOrder = order;
mDirection = direction;
mFilter = filterString;
Query mChartsQuery = getQuery(mDatabaseRef, mOrder, mDirection);
// Update recycler options
FirestoreRecyclerOptions<Chart> recyclerOptions = new FirestoreRecyclerOptions.Builder<Chart>()
.setQuery(mChartsQuery, Chart.class)
.build();
mAdapter = new ChartListAdapter(recyclerOptions, getActivity());
mAdapter.startListening();
mRecycler.setAdapter(mAdapter);
mChartsQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (queryDocumentSnapshots != null) {
// Hide "loading lists" text
mLoadingList.setVisibility(View.GONE);
if(queryDocumentSnapshots.size() > 0) {
mEmptyList.setVisibility(View.GONE);
mRecycler.setVisibility(View.VISIBLE);
}else {
// If number of Charts = 0,
// if we have filtered, show "no results"
// otherwise, show "no charts"
mEmptyList.setVisibility(View.VISIBLE);
mRecycler.setVisibility(View.GONE);
}
}
}
});
}它引用ChartListAdapter类,该类的定义如下:
public class ChartListAdapter extends FirestoreRecyclerAdapter<Chart, ChartViewHolder> {
private Activity mActivity;
public ChartListAdapter(FirestoreRecyclerOptions<Chart> recyclerOptions, Activity activity) {
super(recyclerOptions);
mActivity = activity;
}
@Override
protected void onBindViewHolder(@NonNull ChartViewHolder holder, int position, @NonNull Chart model) {
final String chartKey = this.getSnapshots().getSnapshot(position).getId();
model.setKey(chartKey);
// Set click listener for the chart
// On click, the user can view the chart
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mActivity, ActivityViewChart.class);
intent.putExtra("ChartKey", chartKey);
mActivity.startActivity(intent);
}
});
// Implement long-click menu
mActivity.registerForContextMenu(holder.itemView);
// Bind Chart to ViewHolder
holder.bindToChart(model);
}
@NonNull
@Override
public ChartViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_chart, parent, false);
return new ChartViewHolder(view);
}
}因此,目前这将检索当前用户的所有图表,并对其进行排序和显示。我希望能够做的是过滤结果,以便用户可以输入一些搜索文本,并且只显示其名称或描述包含该文本的图表。
我的理解是,我不能将此作为Firestore查询的一部分,因此我的想法是检索完整的图表列表,然后循环遍历所有图表,删除任何不符合条件的图表,然后显示其余的图表(列表中不太可能有数百个图表;大多数用户只有10个左右)。
我不知道该怎么做,我甚至不确定这是不是最好的方法。最明显的地方似乎是当我在FragmentChartsList中将snapshotListener添加到ChartsQuery中时,但我找不到从列表中删除单个快照的方法。或者,我是否可以将所有项目放入recyclerView中,然后删除不需要的项目?
有谁能给我指个方向吗?我在网上找到的所有东西似乎都是关于删除一个recyclerView项目并将其从数据库中删除,这是我不想做的。
发布于 2019-02-12 16:24:05
您可以将以下查询用于搜索筛选器功能。
databaseReference.collection("charts")
.whereEqualTo("uid", getUid())
.orderBy("name")
.startAt(searchText)
.endAt(searchtText + "\uf8ff");将搜索文本传递给startAt()和endAt()函数,名称是您的documentField。
并将此查询传递给firestoreAdapter,它将为您提供结果记录。
https://stackoverflow.com/questions/54639671
复制相似问题