我的家庭 Activity 中有两个容器,一个是 Top Bar Fragment Container,另一个是 ViewPagers Container。 顶栏片段容器仅由一个片段组成,即顶栏片段(允许用户选择一个标签),而 Viewpagers 由 2 个片段组成,每个片段都有一个回收器 View 来显示帖子与顶部栏片段上选定的标签一起。
我想要实现的是,当单击顶部栏片段上的某个项目时,它会获取文本值,然后使用界面将其发送到 Activity ,稍后片段 View 页面将从 Activity 获取该值并设置根据传递的文本进行 firebase 查询。
到目前为止,片段可以很好地使用接口(interface)相互发送数据。但是,适配器仅在创建 View 时监听一次,而不是在从片段传递数据时监听一次。从顶部栏片段发送数据后如何更新适配器?
这是我的 ViewPagerFragment(RecyclerView):
FirebaseRecyclerOptions options, options2;
FirebaseRecyclerAdapter<Question, QuestionsViewHolder> adapter;
<!---- oncreate Code---->
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
String ChosenTag = tvtest.getText().toString();
if (text.equals("")){
Query query = questionReference.orderByChild("location").equalTo("jakarta");
options = new FirebaseRecyclerOptions.Builder<Question>()
.setQuery(query, Question.class)
.build();
adapter = new FirebaseRecyclerAdapter<Question, QuestionsViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull QuestionsViewHolder holder, int position, @NonNull Question model) {
holder.username.setText(model.getUsername());
}
@NonNull
@Override
public QuestionsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.snippet_card_question_new, viewGroup, false);
QuestionsViewHolder viewHolder = new QuestionsViewHolder(view);
return viewHolder;
}
};
qListRv.setAdapter(adapter);
adapter.startListening();
} else {
Query query = questionReference.orderByChild("tags").equalTo(ChosenTag);
options2 = new FirebaseRecyclerOptions.Builder<Question>()
.setQuery(query, Question.class)
.build();
adapter.updateOptions(options2);
}
}
简单地说,如果用户没有在 TopBarFragment 上进行选择,则文本将返回 null,适配器将查询用户的当前位置。否则,如果用户在顶部栏片段上选择了一个标签,则顶部栏片段会将标签发送到字符串,更新 String ChosenTag,然后适配器会将其选项更新为 options2 ,它查询所选标签。
选择后我无法刷新我的回收 View 。但接口(interface)工作正常。有什么办法可以实现这一点吗?
最佳答案
我到处搜索过,似乎没有人能帮助我,所以这就是我所做的,这对我有用。希望这会有所帮助。
我将片段 B (TopBarFragment) 更改为 Activity (TopBarActivity)
我将片段更改为 Activity 的原因是因为我希望每当用户定向到 TopBar Activity 时整个 RecyclerView 适配器就停止监听。这样我就可以在返回保存 RecyclerViews 的 Activity 时启动一个新的适配器。
计划
- 制作两组适配器(一组用于defaultAdapter,另一组用于 用户在 TopBarActivity 上单击的内容。我们就这样调用它吧 菜单项适配器)。
- 在用户单击 MainActivity 时从 TopBarActivity 发送字符串的附加功能。从那时起,片段将检查字符串 主要 Activity 。
- 创建两个覆盖方法(onPause 和 onResume),以停止监听适配器或开始监听它们。我们将 在这里创建条件来监听默认适配器或 监听用户点击的内容。这些条件将检查是否 第 2 点上的字符串是否存在。如果存在那就听听 menuItemAdapter 否则如果字符串不存在,则监听 默认适配器。
TopBarActivity代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_top_bar);
//I am using Recycler view to display the menu item lists on this activity.
//RecyclerView Codes goes here
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getBaseContext(), MainActivity.class);
i.putExtra("CHOSENITEM", (model.getItemName()));
startActivity(i);
}
}
主要 Activity
public class MainActivity extends AppCompatActivity {
private String choicesName = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
setupTopBarStringListener();
}
private void setupTopBarStringListener() {
choicesName = getIntent().getStringExtra("CHOSENITEM");
}
public String ChoicesString() {
return choicesName;
}
}
String ChoicesString() 随后将在片段 A 中调用
将代码片段化
public class QuestionFragment extends Fragment {
private String myStringFromActivity;
RecyclerView contentListRv;
FirebaseRecyclerOptions options, newoptions;
FirebaseRecyclerAdapter<Post, PostsViewHolder> adapter, newadapters;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
Log.i(TAG, "onViewCreated: restart");
contentListRv= view.findViewById(R.id.contentListRv);
contentListRv.setLayoutManager(new LinearLayoutManager(getContext()));
HomeActivity activity = (HomeActivity) getActivity();
myStringFromActivity = activity.ChoicesString();
Log.i(TAG, "choices from activity= " + myStringFromActivity);
}
}
将默认回收器添加到片段 A
public void setupRecyclers() {
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dschild : dataSnapshot.getChildren()) {
String location = "" + dschild.child("location").getValue();
Query query = questionReference.orderByChild("location").equalTo(location);
options = new FirebaseRecyclerOptions.Builder<Question>()
.setQuery(query, Post.class)
.build();
adapter = new FirebaseRecyclerAdapter<Post, PostsViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull PostsViewHolder holder, int position, @NonNull Question model) {
holder.username.setText(model.getUsername());
}
@NonNull
@Override
public QuestionsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.snippet_posts_view, viewGroup, false);
PostsViewHolder viewHolder = new PostsViewHolder(view);
return viewHolder;
}
};
contentListRV.setAdapter(adapter);
adapter.startListening();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
然后将menuItem Recyclers添加到Fragment A
public void menuItemRecyclers() {
Query query2 = questionReference.orderByChild("tags").equalTo(myStringFromActivity);
newoptions = new FirebaseRecyclerOptions.Builder<Question>()
.setQuery(query2, Post.class)
.build();
newadapters = new FirebaseRecyclerAdapter<Post, PostsViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull PostsViewHolder holder, int position, @NonNull Question model) {
holder.username.setText(model.getUsername());
}
@NonNull
@Override
public QuestionsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.snippet_posts_view, viewGroup, false);
PostsViewHolder viewHolder = new PostsViewHolder(view);
return viewHolder;
}
};
contentListRV.setAdapter(newadapters);
newadapters.startListening();
}
}
}
上面的代码显示,从 MainActivity 检索到的字符串 myStringFromActivity 将成为我们对新适配器的查询。
最后,我们为片段 A 实现 onPause 和 onResume 方法
@Override
public void onPause() {
super.onPause();
Log.i(TAG, "onStop: adapter stopped");
if(myStringFromActivity== null){
adapter.stopListening();
} else {
newadapters.stopListening();
}
}
@Override
public void onResume() {
super.onResume();
if(myStringFromActivity==null){
setupRecyclers();
Log.e(TAG, "onResume: String null" );
}else{
menuItemRecyclers();
}
}
上面的代码显示,如果我们的字符串myStringFromActivity为空(用户没有点击我们的Topbaractivity中的任何项目,那么它就会运行默认的回收站。否则,如果用户选择了一个项目,那么它就会运行运行menuItemRecyclers(基于用户选择)。
我仍然对这一问题的更好实现持开放态度。希望这有帮助!
关于java - 单击下拉菜单中的项目后更改 RecyclerView 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61168463/