如何更新我在整理的数据RecyclerView?

问题描述 投票:0回答:3

我的数据库(公司的FireStore)存储Charts,通过Users创建。

在打开的应用程序,该User显示自己Charts,通过图表名排序(这是显示在一个片段名为MyChartsFragment)。他们可以点击一个按钮来更改排序字段;这应该找回Charts的同一列表,但所选择的字段排序。

我能够在新的排序字段名进入MyChartsFragment,但在这一点上Charts列表一片空白。我想我需要以某种方式重新绘制。

MyChartsFragment如下(我已经去除了大部分在try-catch块,错误检查等,为清楚起见):

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,其中包含:

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功能:

public void setOrder(String order) {

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

    }

这似乎正确更新mOrder的值,但随后它不会重新显示RecyclerView,所以我只是得到一个空白。

我究竟做错了什么?

编辑补充详细信息:

ChartListAdapter类是:

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

}
android android-recyclerview recycler-adapter
3个回答
1
投票

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

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适配器类,添加setter的recyclerOptions:

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

0
投票

发现一个问题...我曾宣布mAdapter有:

private FirestoreRecyclerAdapter<Chart, ChartViewHolder> mAdapter;

当它应该是:

private ChartListAdapter mAdapter;

0
投票

解决......在setOrderField我宣布一个新的mAdapter,但不听它。有一次,我加入

mAdapter.startListening()

这一切工作得很好!

© www.soinside.com 2019 - 2024. All rights reserved.