2016-05-23 24 views
5

Tôi hiện đang có một FirebaseListAdapter mà populates một ListView với 5 hạng mục cuối cùng:Android - FirebaseListAdapter theo thứ tự ngược lại?

@Override 
public void onViewCreated(View view, Bundle savedInstanceState){ 

    FirebaseListAdapter<HashMap> adapter = new FirebaseListAdapter<HashMap>(getParentFragment().getActivity(),HashMap.class,R.layout.list_item,firebase.limitToLast(5)) { 
     @Override 
     protected void populateView(View view, HashMap hashMap, int i) { 
      String title = hashMap.get("title").toString(); 
      String body = hashMap.get("body").toString(); 

      TextView title_txt = (TextView)view.findViewById(R.id.title); 
      TextView body_txt = (TextView)view.findViewById(R.id.body); 

      title_txt.setText(title); 
      body_txt.setText(body); 
     } 
    }; 

    listView.setAdapter(adapter); 

} 

Tôi có vấn đề là khi một mục mới được đẩy lên căn cứ hỏa lực, nó được thêm vào dưới cùng của danh sách. Tôi muốn các mục mới nhất ở đầu danh sách.

Có thể đạt được điều này không?

Bất kỳ trợ giúp nào được đánh giá cao, cảm ơn!

+0

Tại sao bạn lại muốn sử dụng bộ điều hợp Firebase ngay từ đầu? Tôi chỉ có một cái nhìn tại Adapter Firebase và nó chỉ là một adapter đơn giản kéo dài từ BaseAdapter. Tôi khuyên bạn nên tạo bộ điều hợp riêng của mình nếu bạn cần tùy chỉnh mọi thứ. – abeikverdi

+0

Vâng, tôi rất mới với Firebase và cũng không quá kinh nghiệm trong Java để phát triển Android. Tôi thấy rằng FirebaseListAdapter đã nhanh chóng và dễ thực hiện, vì vậy ban đầu tôi quyết định sẽ là một ý tưởng hay khi sử dụng nó. –

+2

@abeikverdi các bộ điều hợp trong FirebaseUI ẩn khá phức tạp sau một số mã khá nhỏ. Dựa trên kinh nghiệm nào bạn khuyên bạn nên viết cho riêng mình? –

Trả lời

11

Đây không phải là giải pháp chính xác cho vấn đề nhận dữ liệu của bạn từ cơ sở dữ liệu theo thứ tự ngược lại, nhưng dù sao, chúng tôi cũng làm việc khác.

Công việc đầu tiên xung quanh được đề cập trong nhận xét về việc sử dụng bộ điều hợp tùy chỉnh cho danh sách của bạn.

Để đạt được hành vi bạn cần để lấy dữ liệu Firebase trong danh sách và sau đó bạn đã tự mình đảo ngược dữ liệu trước khi chuyển nó đến bộ điều hợp. Đơn giản! Công việc thứ hai xung quanh dễ dàng như chiếc bánh và tôi nghĩ rằng nếu bạn đang sử dụng RecyclerView nó có thể làm thủ thuật cho bạn và tôi xem nó như là cách đơn giản nhất bạn có thể thực hiện công việc.

Dưới đây là tôi đang sửa đổi một số mã của tôi với RecyclerView

// Declare the RecyclerView and the LinearLayoutManager first 
private RecyclerView listView; 
private LinearLayoutManager mLayoutManager; 

...

@Override 
public void onViewCreated(View view, Bundle savedInstanceState){ 

    // Use FirebaseRecyclerAdapter here 

    // Here you modify your LinearLayoutManager 
    mLayoutManager = new LinearLayoutManager(MainActivity.this); 
    mLayoutManager.setReverseLayout(true); 
    mLayoutManager.setStackFromEnd(true); 

    // Now set the layout manager and the adapter to the RecyclerView 
    listView.setLayoutManager(mLayoutManager); 
    listView.setAdapter(adapter); 
} 

Bằng cách đặt mLayoutManager.setReverseLayout(true); - bạn đang đảo ngược bố trí của bạn và mLayoutManager.setStackFromEnd(true); vị trí quan điểm về đầu trang trong danh sách của bạn.

Di chuyển đến RecyclerView thật đơn giản. bố trí của bạn sẽ được một cái gì đó như thế này

<?xml version="1.0" encoding="utf-8"?> 
<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="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/my_list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</RelativeLayout> 

Và trong build.gradle

dependencies { 
    compile 'com.android.support:recyclerview-v7:23.4.0' 
} 

của bạn Bạn cần có FirebaseRecyclerAdapter có thể được tìm thấy ở đây trong FirebaseUI thư viện.

Lưu ý: Không sử dụng RecyclerView.LayoutManager như các chức năng setReverseLayoutsetStackFromEnd sẽ không thể tìm thấy trong RecyclerView.LayoutManager. Sử dụng LinearLayoutManager như đã nêu.

Cập nhật

Đây là cách bạn có thể xử lý các sự kiện nhấp chuột của các mục trong danh sách.

Bạn phải khai báo một số ViewHolder để thực hiện quyền RecyclerView? Chỉ cần thêm một hàm khác bên trong lớp ViewHolder của bạn như ví dụ bên dưới và gọi hàm này sau các hàm setText bạn đã có.

public static class MyViewHolder extends RecyclerView.ViewHolder { 
    View mView; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     mView = itemView; 
    } 

    public void setClickEvent() { 
     // Set the onClickListener on mView 
     // mView.setOnClickListener(new OnClickListener)... 
    } 
} 
+1

Tôi đang gặp một số vấn đề với RecyclerView. Tôi đoán nơi bạn đã sử dụng mã ban đầu của tôi, listView là RecyclerView? Khi tôi làm setAdapter (adapter) trên recyclerView, nó không hoạt động: set adapter (android.support.v7.widget.recyclerview.adapter) không thể được áp dụng cho (com.firebase.ui..FirebaseListAdapter ) –

+0

Có 'listView' của bạn là' RecyclerView', bạn đoán nó đúng. Và xin lỗi tôi đặt một sai lầm nhỏ. Vui lòng xem câu trả lời này từ @FrankVanPuffelen http://stackoverflow.com/a/31122788/3145960 để xem cách sử dụng 'FirebaseRecyclerAdapter' để làm việc với' RecyclerView'. Tôi đang chỉnh sửa câu trả lời. –

+1

Điều này dường như đang làm việc, như trong, nó thêm mới nhất để đầu trang. Tôi vẫn còn một chút khó khăn về cách phát hiện các sự kiện nhấp chuột vào các mục trong RecyclerVIew. Bạn có thể giải thích ngắn gọn cách phát hiện sự kiện nhấp chuột không? Về cơ bản, tôi cần mở một đoạn mới khi một trong các mục được nhấp vào. Tôi đã làm việc với ListView. Cảm ơn đã giúp đỡ. –

3

Vì bạn đã mở rộng FirebaseListAdapter để thực hiện populateView, bạn có thể đi trước và ghi đè getItem cũng như để đảo ngược tra cứu mục:

@Override 
public HashMap getItem(int pos) { 
    return super.getItem(getCount() - 1 - pos); 
} 

Nếu bạn không sử dụng RecyclerView đây là một cách đơn giản để đảo ngược dữ liệu mà không cần mở rộng thêm bất kỳ lớp nào khác ngoài mức cần thiết. Rõ ràng điều này sẽ đảo ngược bất kỳ lớp con AdapterView nào được bộ điều hợp này hỗ trợ, nếu bạn chọn sử dụng lại nó.

+0

Tốt nhất! Đây là cách mẫu để thực hiện công việc, kết hợp với orderByChild(). Cảm ơn. – RaySaraiva

+0

hoạt động như một sự quyến rũ! –

Các vấn đề liên quan