【问题标题】:Loading view before Data is loaded into Recycler view在将数据加载到 Recycler 视图之前加载视图
【发布时间】:2016-02-19 13:20:48
【问题描述】:

我想显示一个正在加载的视图,即一个不确定的进度条,直到我使用从 Firebase 获取的数据加载我的回收器视图。我需要知道在 Recycler View 加载数据后立即触发的事件。

我扩展了这个类并用作适配器

https://github.com/mmazzarolo/firebase-recyclerview/blob/master/app/src/main/java/com/example/matteo/firebase_recycleview/FirebaseRecyclerAdapter.java

我的扩展类是

public class TrendingRecycler extends FirebaseRecyclerAdapter
    <TrendingRecycler.ViewHolder, DataStuff> {


public static class ViewHolder extends RecyclerView.ViewHolder {

    TextView Data;


    public ViewHolder(View view) {
        super(view);

        Data= (TextView) view.findViewById(R.id.text_card_trending);
    }
}

public TrendingRecycler(Query query, Class<DataStuff> itemClass) {
    super(query, itemClass);
}


@Override public TrendingRecycler.ViewHolder
onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.trending_card_view, parent, false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(TrendingRecycler.ViewHolder holder,
                                       int position) {


    final DataStuff item = getItem(position);
    holder.Data.setText(item.Data);
    final Context context =holder.itemView.getContext();

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(MyApplication.getAppContext(),
                    item.Tags.toString(), Toast.LENGTH_LONG).show();
            TempShowStore.setDataStuff(item);
            context.startActivity(
                    new Intent(context, ShowComplete.class)
            );
        }
    });
}

@Override
protected void itemAdded(DataStuff item, String key, int position) {
    Log.d("ADDED",String.valueOf(position));
}

@Override
protected void itemChanged(DataStuff oldItem, DataStuff newItem, String key, int position) {
    Log.d("CHANGED",String.valueOf(position));
}

@Override
protected void itemRemoved(DataStuff item, String key, int position) {
    Log.d("REMOVED",String.valueOf(position));
}

@Override
protected void itemMoved(DataStuff item, String key, int oldPosition, int newPosition) {
    Log.d("MOVED",String.valueOf(oldPosition) + " to " +String.valueOf(newPosition));
}

}

【问题讨论】:

  • 你在哪里向适配器填充数据?你能显示一些代码吗?

标签: android firebase android-recyclerview loadview


【解决方案1】:

您必须尝试在适配器中覆盖 onDataChanged():

mProgressDialog.show();
mFirebaseAdapter = new FirebaseRecyclerAdapter(...) {

@Override
protected void populateViewHolder(...) {...}

@Override
protected void onDataChanged() {
    if (mProgressDialog != null && mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
    }
  }

};

【讨论】:

    【解决方案2】:

    AdapterdataObserver注册到RecyclerView.Adapter

    protected RecyclerView.AdapterDataObserver observer= new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            //called When the data in the adapter is changed
        }
    };
    
    yourAdapter.registerAdapterDataObserver(observer);
    

    【讨论】:

    • onChanged 在适配器的数据集更改时会被调用,但我需要知道适配器何时会与回收器视图绑定。对不起,如果我错了,我是一个真正的业余爱好者
    【解决方案3】:

    我发现onItemRangeInserted 方法有效。我用它来检测何时将第一项添加到RecyclerView

    private void setupProgress() {
        vProgress.show();
        mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
    
            @Override
            public void onItemRangeInserted(int positionStart, int itemCount) {
                super.onItemRangeInserted(positionStart, itemCount);
                vProgress.hide();
                mAdapter.unregisterAdapterDataObserver(this);
            }
        });
    }
    

    【讨论】:

    • 这对我不起作用。即使recyclerview中的内容可见,进度对话框也不会消失。有解决方法吗?我正在使用 FirebaseUI 库中的 FirebaseRecyclerAdapter。
    • 这仅在您至少有 1 个项目时才有效,如果没有项目则不会被调用