Как получить строку из адаптера в фрагмент? - PullRequest
0 голосов
/ 30 января 2019

Хм, я люблю разбирать строку от адаптера к фрагменту, как я могу это сделать ??потому что в моих приложениях есть пробел.

это код моего адаптера

Адаптер

public class listAdapter extends RecyclerView.Adapter<listAdapter.ViewHolder> {
private Simpleway simpleway = new Simpleway();
private ArrayList<DataFirebase> dataList;
private AppCompatActivity someActivity;
private TitleFragment fragmentTitle = new TitleFragment();
private ModelData model = new ModelData();

public listAdapter(ArrayList<DataFirebase> dataList, AppCompatActivity someActivity) {
    this.dataList = dataList;
    this.someActivity = someActivity;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.item_label, viewGroup, false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int positions) {
    final DataFirebase labelList = dataList.get(positions);

    viewHolder.textLabel.setText(labelList.getLabel());
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String enough = labelList.getLabel();
            model.setLabel(enough);
            simpleway.toastMessage(someActivity, model.getLabel());
            someActivity.getSupportFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_right)
                    .replace(R.id.container_layout, fragmentTitle)
                    .addToBackStack(null)
                    .commit();

        }
    });

}


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

public class ViewHolder extends RecyclerView.ViewHolder {
    public LinearLayout linearLabel;
    public TextView textLabel;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        textLabel = itemView.findViewById(R.id.text_label);
        linearLabel = itemView.findViewById(R.id.linearLabel);


    }

}
}

Так что в основном мой код для адаптераоткроет мой titlefragment и передаст строку, используя pojo, но я не получил никаких данных String в моем pojo, поэтому посмотрите на мой класс TitleFragment

TitleFragment

public class TitleFragment extends BaseFragment {

private DatabaseReference databaseReference;
private RecyclerView titleRecycleView;
private ArrayList<DataFirebase> listLabel;
private com.example.parzival.flashcard.adapter.titleAdapter titleAdapter;
private DataFirebase dataFirebase = new DataFirebase();
private ModelData modelData = new ModelData();

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

}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_title, container, false);
    findView(view);
    check();
//        setDataToList(view);
    initListener(view);
    putLayoutManager(view);
    return view;
}

private void check() {
    if (modelData.getLabel().equals("")) {
        simpleway.toastMessage(getContext(), "null");
    } else {
        simpleway.toastMessage(getContext(), modelData.getLabel());
    }
}

private void setDataToList(View view) {
    databaseReference.child(modelData.getLabel()).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            listLabel = new ArrayList<>();

            for (DataSnapshot dataSnap : dataSnapshot.getChildren()) {
                DataFirebase dataText = dataSnap.getValue(DataFirebase.class);
                dataText.setTitle(dataSnap.getKey());
                listLabel.add(dataText);
            }

            titleAdapter = new titleAdapter(listLabel, TitleFragment.this);
            titleRecycleView.setAdapter(titleAdapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            System.out.print(databaseError.getDetails() + "" + databaseError.getMessage());
        }
    });

}

private void putLayoutManager(View view) {
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    titleRecycleView.setLayoutManager(layoutManager);
    titleRecycleView.setItemAnimator(new DefaultItemAnimator());
}

@Override
public void findView(View view) {
    databaseReference = FirebaseDatabase.getInstance().getReference();
    titleRecycleView = view.findViewById(R.id.titleRecycleView);

}

@Override
public void initListener(View view) {

}

}

И после того, как я запустил единственную вещь, я получил нулевой объект от model.getLabel() как?я уже ввел строку на модели, не так ли?в model.setLabel(enough) так почему я получил эту ошибку?

РЕДАКТИРОВАТЬ

Я пытаюсь объяснить больше о моей деятельности, возможно. Основная проблема в том, что я использую фрагментчтобы передать данные, и я пытаюсь опубликовать некоторые из моего класса Activity.

ListActivity

public class ListActivity extends BaseActivity{

    private DatabaseReference databaseReference;
    private RecyclerView labelRecycleView;
    private ArrayList<DataFirebase> listLabel;
    private listAdapter listAdapter;
    private Button bInput;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        findView();
        setDataToList();
        initListener();
        putLayoutManager();
    }

    private void setDataToList() {
        simpleway.progressDialog(ListActivity.this);
        databaseReference.child("Username").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                listLabel = new ArrayList<>();
                for (DataSnapshot dataSnap : dataSnapshot.getChildren()) {

                    DataFirebase modelClass = dataSnap.getValue(DataFirebase.class);
                    modelClass.setLabel(dataSnap.getKey());
                    listLabel.add(modelClass);
                }
                listAdapter = new listAdapter(listLabel, ListActivity.this);
                labelRecycleView.setAdapter(listAdapter);
                simpleway.stopProgressDialog();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                System.out.println(databaseError.getDetails() + " " + databaseError.getMessage());
                simpleway.stopProgressDialog();
            }
        });
    }

    private void putLayoutManager() {
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        labelRecycleView.setLayoutManager(layoutManager);
        labelRecycleView.setItemAnimator(new DefaultItemAnimator());
    }

    @Override
    public void findView() {
        databaseReference = FirebaseDatabase.getInstance().getReference();
        labelRecycleView = findViewById(R.id.listRecyclerVIew);
        bInput = findViewById(R.id.inputData);
    }


    @Override
    public void initListener() {
        bInput.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                simpleway.startnextActivity(ListActivity.this, InputActivity.class);
            }
        });
    }

   }

Я использую someActivity, который был передан ListActivity неФрагмент, вот почему

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Решения

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

            String enough = labelList.getLabel();
            TitleFragment titleFragment = new TitleFragment();
            FragmentTransaction fragmentTransaction = someActivity
                    .getSupportFragmentManager()
                    .beginTransaction();

, после этого я использую Bundle, чтобы поставить аргумент

            Bundle bundle = new Bundle();
            bundle.putString("Check", enough);
            titleFragment.setArguments(bundle);

, а затем я пытаюсь открыть свой фрагмент

            fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, 
R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_right)
                    .replace(R.id.container_layout, titleFragment)
                    .addToBackStack(null)
                    .commit();

поэтому я беру свою строку, используя аргумент для фрагмента заголовка

private void setDataToList() {
    if (getArguments() != null) {
        String newText = getArguments().getString("Check");
        simpleway.toastMessage(mContext, newText);
    } else {
        simpleway.toastMessage(mContext, "Failed");
    }

}

и все готово

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

Сначала создайте интерфейс

public interface PassBack {
    void valueFromAdapter(String value);
}

Затем внедрите это в свой Фрагмент вот так

public class TitleFragment extends BaseFragment implements PassBack{

private DatabaseReference databaseReference;
private RecyclerView titleRecycleView;
private ArrayList<DataFirebase> listLabel;
private com.example.parzival.flashcard.adapter.titleAdapter titleAdapter;
private DataFirebase dataFirebase = new DataFirebase();
private ModelData modelData = new ModelData();

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

}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_title, container, false);
    findView(view);
    check();
//        setDataToList(view);
    initListener(view);
    putLayoutManager(view);
    return view;
}

private void check() {
    if (modelData.getLabel().equals("")) {
        simpleway.toastMessage(getContext(), "null");
    } else {
        simpleway.toastMessage(getContext(), modelData.getLabel());
    }
}

private void setDataToList(View view) {
    databaseReference.child(modelData.getLabel()).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            listLabel = new ArrayList<>();

            for (DataSnapshot dataSnap : dataSnapshot.getChildren()) {
                DataFirebase dataText = dataSnap.getValue(DataFirebase.class);
                dataText.setTitle(dataSnap.getKey());
                listLabel.add(dataText);
            }

            titleAdapter = new titleAdapter(listLabel, TitleFragment.this);
            titleRecycleView.setAdapter(titleAdapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            System.out.print(databaseError.getDetails() + "" + databaseError.getMessage());
        }
    });

}

private void putLayoutManager(View view) {
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    titleRecycleView.setLayoutManager(layoutManager);
    titleRecycleView.setItemAnimator(new DefaultItemAnimator());
}

@Override
public void findView(View view) {
    databaseReference = FirebaseDatabase.getInstance().getReference();
    titleRecycleView = view.findViewById(R.id.titleRecycleView);

}

@Override
public void initListener(View view) {

}

@Override
public void valueFromAdapter(String value) {
//here you will get the value 
}

}

Затем в вашем адаптере используйте его вот так

public class listAdapter extends RecyclerView.Adapter<listAdapter.ViewHolder> {
private Simpleway simpleway = new Simpleway();
private ArrayList<DataFirebase> dataList;
private AppCompatActivity someActivity;
private TitleFragment fragmentTitle = new TitleFragment();
private ModelData model = new ModelData();

public listAdapter(ArrayList<DataFirebase> dataList, AppCompatActivity someActivity) {
    this.dataList = dataList;
    this.someActivity = someActivity;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.item_label, viewGroup, false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int positions) {
    final DataFirebase labelList = dataList.get(positions);

    viewHolder.textLabel.setText(labelList.getLabel());
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String enough = labelList.getLabel();
            model.setLabel(enough);
            simpleway.toastMessage(someActivity, model.getLabel());
            someActivity.valueFromAdapter(enough)//this is how you send your value

        }
    });

}


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

public class ViewHolder extends RecyclerView.ViewHolder {
    public LinearLayout linearLabel;
    public TextView textLabel;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        textLabel = itemView.findViewById(R.id.text_label);
        linearLabel = itemView.findViewById(R.id.linearLabel);


    }

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

В вашем адаптере

A.Создать интерфейс

public interface Listener {
  void callback(String data);
}

B.Создать поле

 private Listener listener;

C.Инициализируйте слушателя на onCreateViewHolder

listener =  (Listener)viewGroup.getContext()

D.Заданное значение

 String enough = labelList.getLabel();
 listener.callback(enough) // Set the value here

В вас фрагмент

(в одну сторону)

Реализация интерфейса в методе обратного вызова, вы можете получить данные.

(Другой способ)

  1. Непосредственная реализация слушателя в onCreateанонимный объект
0 голосов
/ 30 января 2019
public interface CallBackListener {
    void onCallBack(String data);// pass any parameter in your onCallBack which you want to return
}

внутри фрагмента создайте анонимный объект

  CallBackListener listener=new CallBackListener() {

                @Override
                public void onCallBack(String data) {
                    // TODO Auto-generated method stub

                }
            };

с вашего адаптера передайте ссылку слушателя, а внутри onClick вызовите onCallBack (data);

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