Данные успешно получены из базы данных, но не могут пройти через класс адаптера - PullRequest
0 голосов
/ 06 января 2019

Хорошо ... я хочу показать данные, полученные из базы данных Firebase в RecycleView, и выполнять другие действия, такие как редактирование, обновление и т. Д. Итак, я использую наблюдаемый шаблон для извлечения данных (что успешно сделано) и пытаюсь передать данные в конструктор и класс адаптера. Данные отображались в классе конструктора, но не загружались в классе адаптера, а также в RecycleView.

Фрагмент класса или основного класса

public class overviewFragment extends Fragment {

View view;
public static RecyclerView overRecycleView;
public overviewFragment() {}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.overview_fragment, container, false);
    overRecycleView = view.findViewById(R.id.overViewRecycle);
    overviewRecyclerAdapter adapter = new overviewRecyclerAdapter(getContext(), observerData.overViewlist);
    overRecycleView.setLayoutManager(new LinearLayoutManager(getActivity()));
   // adapter.notifyDataSetChanged();
    overRecycleView.setAdapter(adapter);
    return view;
}

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

    observableData ob =new observableData();
    observerData observerData = new observerData(ob)
    ob.setMeasurement();
    ob.setMeasurement();  }}

наблюдаемый класс для извлечения данных из базы огня и уведомления наблюдателя

public class observableData extends Observable {
private String data;

public observableData() { }

public void setMeasurement(){
    final DatabaseReference n = ScrollingActivityforTutor.db();

    n.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String a = dataSnapshot.child("name").getValue().toString();
            Log.d("name from database ", a);

            data =a;

            measurementChanged();

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

public void measurementChanged(){
    setChanged();
    notifyObservers();
}

public String getData() {
    return data;
}
}

класс наблюдателя, откуда будет называться класс конструктора

public class observerData implements  Observer {
Observable observable;
public String data;
public static List<itemOverview> overViewlist = new ArrayList<>();;

public observerData(Observable observable) {
    this.observable = observable;
    observable.addObserver(this);
}

@Override
public void update(Observable o, Object arg) {
    observableData od = (observableData) o;
    this.data = od.getData();
    passData();
}

public void passData(){
    overViewlist.add(new itemOverview(data));
    Log.d("data in observer ", data);
}
}

класс конструктора

public class itemOverview {

private String text;

public itemOverview(String text) {
    Log.d("IN CONSTRUCTOR ", text);  // It is perfectly showing the data
    this.text = text;
}

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}}

Адаптер класса

 public class overviewRecyclerAdapter extends 
 RecyclerView.Adapter<overviewRecyclerAdapter.overviewViewHolder> {
 Context mcontext;
 List<itemOverview> mdata;

 public overviewRecyclerAdapter(Context mcontext, List<itemOverview> mdata) 
{
    this.mcontext = mcontext;
    this.mdata = mdata;  }

public static class overviewViewHolder extends RecyclerView.ViewHolder{

    private TextView t;

    public overviewViewHolder(@NonNull View itemView) {
        super(itemView);

        t = itemView.findViewById(R.id.overViewtextView); }}

@NonNull
@Override
public  overviewRecyclerAdapter.overviewViewHolder 
onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v;
    v = LayoutInflater.from(mcontext).inflate(R.layout.item_overview, 
    parent, false);
    overviewViewHolder overview = new overviewViewHolder(v);
    return overview;  }

@Override
public void onBindViewHolder(@NonNull 
overviewRecyclerAdapter.overviewViewHolder holder, int position) {

    Log.d("IN ADAPTER ", mdata.get(position).getText());  // HERE, IT IS 
    NOT WORKING

    holder.t.setText(mdata.get(position).getText());

}
@Override
public int getItemCount() {
    return mdata.size() ;
}}

Но когда я использую measureChanged () (в наблюдаемом классе) вне метода onDatachange и помещаю данные (переменную) с некоторым строковым значением, все работает, и данные отображаются в recycleView.

Не понимаю, где проблема и где отлаживать.

Однако, извините за такие большие мили кодов :) Спасибо

1 Ответ

0 голосов
/ 11 января 2019

Я вижу, что вы пытаетесь программно добавить элементы в RecyclerView. Но RecyclerView не обновляется при обновлении массива, содержащего необходимые данные. Поскольку вы сделали статический RecyclerView, вы можете легко уведомить об изменениях в адаптере, используя следующий код:

public void passData(){
    overViewlist.add(new itemOverview(data));
    Log.d("data in observer ", data);

    overviewRecyclerAdapter adapter = (overviewRecyclerAdapter) overviewFragment.overRecycleView.getAdapter();
    adapter.notifyDataSetChanged();        
}

Есть гораздо лучшие способы сделать это. adapter.notifyItemInserted(overViewlist.size()-1);, вероятно, является лучшим решением в вашем случае (с точки зрения производительности).

P.S. Вы должны следовать соглашениям об именах в java, чтобы сделать ваш код более читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...