首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新排序数据的RecyclerView?

如何更新排序数据的RecyclerView?
EN

Stack Overflow用户
提问于 2019-02-06 20:33:52
回答 4查看 1.2K关注 0票数 0

我的数据库(Firestore)存储由Charts创建的User

在打开应用程序时,User会显示他们自己的Charts,并按图表名称排序(这将显示在一个名为MyChartsFragment的片段中)。他们可以单击一个按钮来更改排序字段;这将检索相同的Charts列表,但按所选字段排序。

我能够将新的排序字段名传递给MyChartsFragment,但此时Charts列表为空。我想我需要重新画一遍。

MyChartsFragment如下所示(为了清晰起见,我已经删除了大部分试图捕获块、错误检查等):

代码语言:javascript
复制
public class FragmentMyCharts extends FragmentChartsList {

    public FragmentMyCharts() {}

    public Query getQuery(FirebaseFirestore databaseReference, String orderBy) {
        // Specify the query which is used to retrieve this user's charts
        return databaseReference.collection("charts")
                .whereEqualTo("uid", getUid())
                .orderBy(orderBy);
    }
}

这扩展了FragmentChartsList,它包含:

代码语言:javascript
复制
public abstract class FragmentChartsList extends Fragment {

    private FirebaseFirestore mDatabaseRef;
    private FirestoreRecyclerAdapter<Chart, ChartViewHolder> mAdapter;
    private Query mChartsQuery;
    private RecyclerView mRecycler;
    private String mOrder = "name";

    FragmentManager mFragmentManager;
    ToolbarFragmentListCharts mFragmentTLC;

    public FragmentChartsList() {}

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

        // Inflate layout, and find Recycler View to hold the list
        View rootView = inflater.inflate(
                R.layout.fragment_charts_list, container, false);

        mRecycler = rootView.findViewById(R.id.charts_list);
        mRecycler.setHasFixedSize(true);

        // 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, and get the appropriate query
        mDatabaseRef = FirebaseFirestore.getInstance();
        mChartsQuery = getQuery(mDatabaseRef, mOrder);

        // Set up Recycler Adapter
        FirestoreRecyclerOptions<Chart> recyclerOptions = new FirestoreRecyclerOptions.Builder<Chart>()
                .setQuery(mChartsQuery, Chart.class)
                .build();

        mAdapter = new ChartListAdapter(recyclerOptions, this.getActivity());

        // Use Recycler Adapter in RecyclerView
        mRecycler.setAdapter(mAdapter);

        return rootView;
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // Add listener to charts collection, and deal with any changes by re-showing the list
        mChartsQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots,
                                @Nullable FirebaseFirestoreException e) {

                if (queryDocumentSnapshots != null && queryDocumentSnapshots.isEmpty()) {
                    ((MainActivity) Objects.requireNonNull(getActivity())).setPage(1);
                }

            }
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        mAdapter.startListening();
    }

    public void setOrderField(String order) {
        mOrder = order;
        mChartsQuery = getQuery(mDatabaseRef, mOrder);

        // Set up Recycler Adapter
        FirestoreRecyclerOptions<Chart> recyclerOptions = new FirestoreRecyclerOptions.Builder<Chart>()
                .setQuery(mChartsQuery, Chart.class)
                .build();

        mAdapter = new ChartListAdapter(recyclerOptions, this.getActivity());

        // Use Recycler Adapter in RecyclerView
        mRecycler.setAdapter(mAdapter);

    }

    public abstract Query getQuery(FirebaseFirestore databaseReference, String orderBy);

}

因此,当工具栏通知主活动排序字段已更改时,它将检索MyChartsFragment (作为FragmentChartsList)并调用setOrderField函数:

代码语言:javascript
复制
public void setOrder(String order) {

        FragmentChartsList myCharts = (FragmentChartsList) mPagerAdapter.getItem(0);
        myCharts.setOrderField(order);

    }

这似乎正确地更新了mOrder的值,但是它没有重新显示RecyclerView,所以我只得到一个空白。

我做错了什么?

编辑以增加细节:

我的ChartListAdapter课程是:

代码语言:javascript
复制
public class ChartListAdapter
        extends FirestoreRecyclerAdapter<Chart, ChartViewHolder> {

    private Activity mActivity;
    private FirestoreRecyclerOptions<Chart> recyclerOptions;

    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
        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);
    }

    public void setRecyclerOptions(FirestoreRecyclerOptions<Chart> recyclerOptions) {
        this.recyclerOptions = recyclerOptions;
    }

}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-08 17:28:12

解决了..。在setOrderField中,我声明了一个新的mAdapter,但没有听它的。有一次我

mAdapter.startListening()

一切都很好!

票数 0
EN

Stack Overflow用户

发布于 2019-02-06 20:56:51

而不是重新创建recyclerView适配器,尝试更新适配器中的选项。

代码语言:javascript
复制
public void setOrderField(String order) {
        mOrder = order;
        mChartsQuery = getQuery(mDatabaseRef, mOrder);

        // Set up Recycler Adapter
        FirestoreRecyclerOptions<Chart> recyclerOptions = new FirestoreRecyclerOptions.Builder<Chart>()
                .setQuery(mChartsQuery, Chart.class)
                .build();


        // Use Recycler Adapter in RecyclerView
        mAdapter.setRecyclerOptions(recyclerOptions);

       // then call the notify data set changed on the adapter to recreate the recyclerView elements
       mAdapter.notifyDataSetChanged();
    }

在recyclerView适配器类中,为recyclerOptions添加一个setter:

代码语言:javascript
复制
public void setRecyclerOptions(FirestoreRecyclerOptions<Chart> recyclerOptions) {
       this.recyclerOptions = recyclerOptions;
    }
票数 1
EN

Stack Overflow用户

发布于 2019-02-07 16:36:18

发现一个问题..。我声明mAdapter时:

代码语言:javascript
复制
private FirestoreRecyclerAdapter<Chart, ChartViewHolder> mAdapter;

本来应该是:

代码语言:javascript
复制
private ChartListAdapter mAdapter;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54562130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档