有点复杂,但我会尽力解释。我有3个碎片。第一个片段(NoteFragment)保存所有注释的recycler视图。第二个片段(AddNoteFragment)在我单击AddNote按钮时打开,这是第一个片段中的按钮。第三个片段(RemoveNoteFragment)是我单击其中一个注释后出现的片段。(NoteAdapter中有一个侦听器)。
第一个片段和第二个片段出现在相同的框架布局中。在第二个片段中,我有一个按钮,只要我点击它,我就想删除笔记(从回收器视图和Firebase-查看代码我是如何做到的)。
注释片段
public class NoteFragment extends Fragment implements View.OnClickListener {
private RecyclerView RVNotesList;
private ArrayList<Note> notes = new ArrayList<>();
private NotesAdapter adapter;
private ImageView mAddNoteBTN;
private Note note;
private ArrayList<String> keys = new ArrayList<>();
private FirebaseAuth mAuth;
private FirebaseDatabase db;
private DatabaseReference users;
private RecyclerView.LayoutManager layoutManager;
private Fragment removeFragment;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main_notes, container, false);
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
removeFragment = new RemoveNoteFragment();
mAuth = FirebaseAuth.getInstance();
db = FirebaseDatabase.getInstance();
users = db.getReference("Users").child(mAuth.getCurrentUser().getUid()).child("Notes");
mAddNoteBTN = view.findViewById(R.id.addNoteBTN);
mAddNoteBTN.setOnClickListener(this);
RVNotesList = view.findViewById(R.id.RVNotesList);
users.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
notes.clear();
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
note = dataSnapshot1.getValue(Note.class);
notes.add(note);
keys.add(dataSnapshot1.getKey());
}
adapter = new NotesAdapter(notes, getActivity(), keys);
if (adapter.getItemCount() <= 3) {
layoutManager = new GridLayoutManager(getActivity(), 1);
} else {
layoutManager = new GridLayoutManager(getActivity(), 3);
}
RVNotesList.setLayoutManager(layoutManager);
RVNotesList.setAdapter(adapter);
adapter.setOnNoteClickListener(new NotesAdapter.OnNoteClickListener() {
@Override
public void onNoteClick(final int position) {
getFragmentManager().beginTransaction().replace(R.id.bottom_container, removeFragment)
.commit();
String key = keys.get(position);
users.child(key).removeValue();
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.addNoteBTN:
getFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_left_to_right, R.anim.exit_left_to_right).replace(R.id.bottom_container, new AddNoteFragment())
.commit();
break;
}
}
}
添加注释片段
public class AddNoteFragment extends Fragment implements View.OnClickListener, AddNotePresenter {
private EditText ETnoteTitle, ETnoteDesc;
private TextView TVnoteLastDate;
private Button saveNoteBTN, deleteNoteBTN, BTNtaskDatePicker;
private Note note;
private int day;
private int month;
private int year;
private Calendar c;
private DatePickerDialog dpd;
private AddNoteView addNoteView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_note, container, false);
addNoteView = new AddNoteView(this);
ETnoteTitle = view.findViewById(R.id.noteTitle);
ETnoteDesc = view.findViewById(R.id.noteDesc);
TVnoteLastDate = view.findViewById(R.id.TVnoteLastDate);
BTNtaskDatePicker = view.findViewById(R.id.taskDatePicker);
BTNtaskDatePicker.setOnClickListener(this);
saveNoteBTN = view.findViewById(R.id.saveNoteBTN);
saveNoteBTN.setOnClickListener(this);
deleteNoteBTN = view.findViewById(R.id.deleteNoteBTN);
deleteNoteBTN.setOnClickListener(this);
return view;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.saveNoteBTN:
saveNote();
hideKeyboard(getActivity());
break;
case R.id.deleteNoteBTN:
removeAddNoteFragment();
hideKeyboard(getActivity());
break;
case R.id.taskDatePicker:
showDatePicker();
break;
}
}
@Override
public void removeAddNoteFragment() {
getFragmentManager().beginTransaction().
remove(getFragmentManager().findFragmentById(R.id.bottom_container)).commit();
}
public void showDatePicker() {
c = Calendar.getInstance();
day = c.get(Calendar.DAY_OF_MONTH);
month = c.get(Calendar.MONTH);
year = c.get(Calendar.YEAR);
dpd = new DatePickerDialog(getActivity(), R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int mYear, int mMonth, int mDay) {
day = mDay;
month = mMonth + 1;
year = mYear;
TVnoteLastDate.setText(mDay + "/" + (mMonth + 1) + "/" + mYear);
}
}, day, month, year);
dpd.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
dpd.show();
}
public void saveNote() {
String title = ETnoteTitle.getText().toString().trim();
String desc = ETnoteDesc.getText().toString().trim();
String date = TVnoteLastDate.getText().toString().trim();
if (title.isEmpty() || desc.isEmpty() || date.isEmpty()) {
return;
}
note = new Note(title, desc, day, month, year);
addNoteView.pushNote(note);
}
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
View view = activity.getCurrentFocus();
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
删除注释片段
public class RemoveNoteFragment extends Fragment{
private ImageView IVremoveNote;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_remove_note, container, false);
IVremoveNote = view.findViewById(R.id.IVremoveNote);
return view;
}
}
注意适配器
public class NotesAdapter extends RecyclerView.Adapter<NotesAdapter.NotesViewHolder> {
private ArrayList<Note> notes;
private Context context;
private ArrayList<String> keys;
private OnNoteClickListener onNoteClickListener;
public NotesAdapter(ArrayList<Note> notes, Context context, ArrayList<String> k) {
this.notes = notes;
this.context = context;
this.keys = k;
}
public interface OnNoteClickListener {
void onNoteClick(int position);
}
public void setOnNoteClickListener(OnNoteClickListener onNoteClickListener) {
this.onNoteClickListener = onNoteClickListener;
}
@NonNull
@Override
public NotesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.note_list_item, parent, false);
return new NotesAdapter.NotesViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final NotesViewHolder holder, final int position) {
final Note note = notes.get(position);
holder.TVnoteCardTitle.setText(notes.get(position).getmNoteTitle());
holder.TVnoteCardDesc.setText(notes.get(position).getmNoteDescription());
String lastDayToConfirmNote = (notes.get(position).getmDay() + "/"
+ notes.get(position).getmMonth() + "/" + notes.get(position).getmYear());
holder.TVnoteCardLastDate.setText(lastDayToConfirmNote);
}
@Override
public int getItemCount() {
return notes.size();
}
public class NotesViewHolder extends RecyclerView.ViewHolder {
private TextView TVnoteCardTitle;
private TextView TVnoteCardDesc;
private TextView TVnoteCardLastDate;
public NotesViewHolder(@NonNull View itemView) {
super(itemView);
TVnoteCardTitle = itemView.findViewById(R.id.TVnoteCardTitle);
TVnoteCardDesc = itemView.findViewById(R.id.TVnoteCardDesc);
TVnoteCardLastDate = itemView.findViewById(R.id.TVnoteCardLastDate);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onNoteClickListener != null) {
onNoteClickListener.onNoteClick(getAdapterPosition());
}
}
});
}
}
}
我想要什么?我想要,一旦我点击了IVRemveNote,这是在删除NoteFrach里面,我的NoteFrach知道这一点,我可以在它里面做的动作(在注意片段)。
或者,如果你有另一种删除便条的方法,我很想听听。
请注意,为了删除注释,我使用注释适配器内部的侦听器,它接受keys数组列表位置。
您应该考虑使用架构组件中的LiveData和ViewModel,这是谷歌推荐的设计模式。这需要一点时间来掌握窍门,但你几乎可以在每一个应用程序中使用它,这会让你的问题变得非常简单。例如,请参见以下概述。这是一个非常好的YouTube教程,它准确地描述了你的笔记示例,不是针对Firebase,而是针对Android Room(本地数据库而不是云)。这有点长,但你会有一个很好的理解之后。
基本上,您可以从Firebase数据库查询所有笔记以接收LiveData
然后,您可以观察LiveData allNotes来获取列表,并将其设置为您的回收器视图。这样,您的回收器视图中总是有最新的数据。当您从数据库中删除注释时,它将自动更新列表并在回收器视图中显示。
希望这些片段是由同一个活动托管的。您可以通过((YourActivityClassName)getActive())从片段调用活动的方法。你的公共方法();
在那里你可以写你的逻辑来调用片段方法,侦听器或其他什么
可以做的一件事是在NoteFragment中创建一个方法,然后在按下RemoveNoteFragment中的IVremoveNote时调用该方法。在此方法中,可以添加删除节点/行的功能。小费!-可以在方法参数中传递注释/行信息。我希望有帮助。
问题内容: 我想在片段类中禁用后退按钮。在此片段中似乎不起作用。如何禁用后退按钮? 这是我的示例代码: 问题答案: 您必须重写父FragmentActivity类的onBackPressed。因此,将您的代码放在父FragmentActivity中。或者,您可以使用以下方法调用父方法: 在FragmentActivity中重写onBackPressed方法,而不调用其超类来禁用后退按钮。
我在弄清楚碎片是如何工作的。我有3个类,MainActivity,Fragment1和fragment2。 MainActivity扩展了 Fragment2还扩展了SherlockFragment,但什么也不做,将它膨胀为空。xml
我想从片段到活动使用返回按钮使用工具栏返回图标。 碎片是我的抽屉菜单项 我该怎么做?
我使用这个代码来替换片段,但有一个问题,它不是替换旧片段,它只是覆盖旧片段,所以请告诉我这里有什么问题。
我合并了一个水平幻灯片导航组件(这需要使类扩展片段)。滑动部分工作正常。这里我有相应的<code>onClick() 到目前为止,我的代码还不多,所以我不会用相关的布局部分来混淆我的问题。任何帮助都是非常感谢的。 片段#1的Java代码 public class TasksFragment扩展Fragment { @ Override public View oncreate View(layou
我有一个活动是持有5个片段。其中一个片段是持有5更多的碎片。如果我添加到片段管理器a. addToBackStack(空)。返回按钮返回到活动的最后一个片段,而不是从“父亲”片段的最后一个片段(即持有5更多的片段)。 有什么帮助吗。。 编辑: