Получить несколько данных из базы Firebase в шоу в разных блоках - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь получить макет, подобный этому.

LAYOUT

Данные хранятся в базе данных, например

 pic [
{     college name: x
      pic_url: https://x
}
{    college name:y
    pic_url : http:// y
}
{
    college name: z
    pic_url: http:// z
}
]

Я хочу загрузить все изображения названия колледжа x в первом блоке под заголовком X, изображения названия колледжа y во втором блоке под заголовком X и так далее.

Я могу хранить данные в разных массивах и, используя несколько layoutmanager / layout layout, я могу показать данные.Но это делает это медленнее.Каковы способы достижения этого?и поскольку текст заголовка рисунка (заголовок 1. заголовок 2 и т. д.) фиксируется в текстовом представлении (не получая его из firebase), поэтому, когда я загружаю фрагмент, он показывает только все текстовые представления подряд, пока не будут получены данные из firebaseзагружается, что занимает около 3/4 секунд.

Как мне этого добиться?

edit: класс фрагмента

public class DashboardFragment extends Fragment {
View v;
ViewPager viewPager;
TabLayout tabLayout;

ValueEventListener mFragmentListener;
ValueEventListener mFragmentListener2;

ArrayList<firebasestore> list;
ArrayList<firebasestore> list2;

DatabaseReference mdatabaseRef;

GridLayoutManager gridLayoutManager;
GridLayoutManager gridLayoutManager2;


private firebaseAdapter firebaseAdapter1;
private firebaseAdapter firebaseAdapter2;


public DashboardFragment() {
    // Required empty public constructor
}

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

    mdatabaseRef = FirebaseDatabase.getInstance().getReference();
    mdatabaseRef.keepSynced(true);

    list = new ArrayList<>();
    list2 = new ArrayList<>();


    loadDetails();
    loadDetails2();

}

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

    v = inflater.inflate(R.layout.fragment_dashboard, container, false);
    viewPager = v.findViewById(R.id.viewPa);

    ownPagerAdapter own = new ownPagerAdapter(getActivity());
    viewPager.setAdapter(own);
    tabLayout = v.findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager, true);

    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new MyTimer(), 5000, 6000);

    int mNoOfColumns = Utility.calculateNoOfColumns(getContext());
    gridLayoutManager = new GridLayoutManager(getContext(), mNoOfColumns);
    gridLayoutManager2 = new GridLayoutManager(getContext(), mNoOfColumns);

    RecyclerView firebaseRecyclerView = (RecyclerView) v.findViewById(R.id.recyclerview_threeFragment1);
    RecyclerView firebaseRecyclerView2 = (RecyclerView) v.findViewById(R.id.recyclerview_threeFragment2);

    firebaseRecyclerView.setHasFixedSize(true);

    firebaseAdapter1 = new firebaseAdapter(getContext(), list);
    firebaseAdapter2 = new firebaseAdapter(getContext(), list2);

    firebaseRecyclerView.setLayoutManager(gridLayoutManager);
    firebaseRecyclerView2.setLayoutManager(gridLayoutManager2);

    firebaseRecyclerView.setAdapter(firebaseAdapter1);
    firebaseRecyclerView2.setAdapter(firebaseAdapter2);

    firebaseRecyclerView.getItemAnimator().setChangeDuration(0);
    firebaseRecyclerView2.getItemAnimator().setChangeDuration(0);

    firebaseRecyclerView.setNestedScrollingEnabled(false);
    firebaseRecyclerView2.setNestedScrollingEnabled(false);

    return v;
}

// get data from firebase DB
private void loadDetails() {
    Query mQuery = mdatabaseRef.orderByChild("uni").equalTo("x");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            list.clear();  // CLAER DATA BEFORE CHANGING. IF NOT DONE, IT WILL SHOW DUPLICATE DATA
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                list.add(ds.getValue(firebasestore.class));
            }
            firebaseAdapter1.notifyDataSetChanged();    // NOTIFY ADAPTER TO SHOW DATA IN VIEW WITHOUT RELOAD
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w("LogFragment", "loadLog:onCancelled", databaseError.toException());
        }
    };

    mFragmentListener = mQuery.limitToLast(25).addValueEventListener(valueEventListener);
}



private void loadDetails2() {
    Query mQuery = mdatabaseRef.orderByChild("uni").equalTo("y");
    ValueEventListener valueEventListener2 = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            list2.clear();  // CLAER DATA BEFORE CHANGING. IF NOT DONE, IT WILL SHOW DUPLICATE DATA
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                list2.add(ds.getValue(firebasestore.class));
            }
            firebaseAdapter2.notifyDataSetChanged();    // NOTIFY ADAPTER TO SHOW DATA IN VIEW WITHOUT RELOAD
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w("LogFragment", "loadLog:onCancelled", databaseError.toException());
        }
    };
    mFragmentListener2 = mQuery.limitToLast(25).addValueEventListener(valueEventListener2);
}

    @Override
    public void onDestroyView () {
        super.onDestroyView();
    }

    class MyTimer extends TimerTask {

        @Override
        public void run() {
            if (getActivity() != null)
                getActivity().runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                        if (viewPager.getCurrentItem() == 0) {
                            viewPager.setCurrentItem(1);
                        } else if (viewPager.getCurrentItem() == 1) {
                            viewPager.setCurrentItem(2);
                        } else if (viewPager.getCurrentItem() == 2) {
                            viewPager.setCurrentItem(0);
                        }
                    }
                });
        }
    }
}

XML этого фрагмента

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/appbar">

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:contextOffers=".Activity.MainActivity">
    <RelativeLayout
        android:id="@+id/image_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPa"
            android:layout_width="match_parent"
            android:layout_height="200dp"

            android:overScrollMode="never" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/viewPa"
            android:layout_marginTop="-40dp"
            app:tabBackground="@drawable/selector_tab"
            app:tabGravity="center"
            app:tabIndicatorHeight="0dp" />
    </RelativeLayout>
 <!--       uni 1      -->
    <android.support.v7.widget.CardView
        android:id="@+id/cardview1"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        app:cardCornerRadius="2dp"
        android:clickable="false"
        android:importantForAutofill="auto"
        android:layout_below="@+id/image_layout"
        android:layout_marginLeft="0dp"
        android:layout_marginRight="0dp"
        android:layout_marginTop="-10dp"
        android:padding="15dp">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/title 1"
                android:textSize="15sp"
                android:textColor="#ffffff"
                android:textStyle="bold"
                android:layout_marginTop="5dp"
                android:padding="5dp"
                android:layout_centerInParent="true"/>
        </RelativeLayout>
    </android.support.v7.widget.CardView>
        <RelativeLayout
            android:id="@+id/linear"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/cardview1"
            android:orientation="vertical">
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerview_threeFragment1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginTop="10dp"
                android:background="#ffffff">
            </android.support.v7.widget.RecyclerView>
        </RelativeLayout>
    <!--       block 2      -->
    <android.support.v7.widget.CardView
        android:id="@+id/cardview2"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        app:cardCornerRadius="2dp"
        android:clickable="false"
        android:layout_below="@+id/linear"
        android:layout_marginLeft="0dp"
        android:layout_marginRight="0dp"
        android:layout_marginTop="0dp"
        android:padding="15dp">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="title 2"
                android:textSize="15sp"
                android:textColor="#ffffff"
                android:textStyle="bold"
                android:layout_marginTop="5dp"
                android:padding="5dp"
                android:layout_centerInParent="true"/>
        </RelativeLayout>
    </android.support.v7.widget.CardView>
    <RelativeLayout
        android:id="@+id/linear2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/cardview2"
        android:orientation="vertical">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerview_threeFragment2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="10dp"
            android:background="#ffffff">
        </android.support.v7.widget.RecyclerView>
    </RelativeLayout>
</RelativeLayout>
</ScrollView>

1 Ответ

0 голосов
/ 15 апреля 2019

То, что вы ищете, - это то, как ваш адаптер будет отображать данные, поскольку данные хранятся в одном месте, когда вы их получаете и помещаете в свой список, вам потребуются разные типы просмотра.

Вы можете проверить этот вопрос о том, как его реализовать.

По сути, вы извлекаете данные из Firebase и сохраняете их в своем списке, теперь в вашем списке будут такие данные

college_name = "x", college_name = "y", college_name = "y",college_name = "x"

Тогда в вашем onCreateViewHolder вы будете иметь разные завышенные представления (если необходимо, или это может быть тот же самый), и в вашем onBindViewHolder вы будете переключаться между данными x и y, которые заполняют ваш RecyclerView.

ViewTypes определяет, что должно отображаться (x или y)

...