android - 如何从不同的 Fragment B 更改 Fragment A 中 RecyclerView 项的按钮文本
问题描述
我在一个活动中有两个片段Fragment A Fragment B 。在片段 A 中,我实现了RecyclerView,它在 ViewHolder 的帮助下显示一个项目列表,每个项目 - 作为 TextView 的文本。我想要的是通过单击Fragment B中的按钮来更改 RecyclerView 中 TextView 的背景颜色
我附上了图片:
这是主要活动的代码
package com.tutorials180.changerecycleritem;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
FragOne objectFragOne=new FragOne();
FragTwo objectFragTwo=new FragTwo();
public MyAdapter.MyInterfaceJIP objectMyInterfaceJIP;
ArrayList<String> arrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arrayList=new ArrayList<>();
arrayList.add("Hi");
arrayList.add("Bi");
arrayList.add("new");
changeFragment(objectFragOne,arrayList);
}
public void changeFragment(Fragment object, MyAdapter.MyInterfaceJIP objectMyInterfaceJIP)
{
Bundle bearTokenBundle=new Bundle();
bearTokenBundle.putParcelable("interface",objectMyInterfaceJIP);
bearTokenBundle.putStringArrayList("my",arrayList);
object.setArguments(bearTokenBundle);
FragmentTransaction objectFragmentTransaction=getSupportFragmentManager().beginTransaction();
objectFragmentTransaction.replace(R.id.container,object).commit();
}
public void changeFragment(Fragment object,ArrayList<String> data)
{
Bundle bearTokenBundle=new Bundle();
bearTokenBundle.putStringArrayList("my",data);
object.setArguments(bearTokenBundle);
FragmentTransaction objectFragmentTransaction=getSupportFragmentManager().beginTransaction();
objectFragmentTransaction.replace(R.id.container,object).commit();
}
}
适配器代码
package com.tutorials180.changerecycleritem;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
FragOne objectFragOne;
FragTwo objectFragTwo;
Context context;
ArrayList<String> objArrayList;
public MyAdapter(FragOne objectFragOne, FragTwo objectFragTwo, Context context, ArrayList<String> objArrayList) {
this.objectFragOne = objectFragOne;
this.objectFragTwo = objectFragTwo;
this.context = context;
this.objArrayList = objArrayList;
}
public interface MyInterfaceJIP extends Parcelable {
public void deleteItem();
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.single_item,parent,false));
}
boolean moved=false;
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
if(!moved){
holder.objectTextView.setText("MOVE");}
else if(moved)
{
holder.objectTextView.setText("Moved Baby");}
holder.objectTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final MainActivity obj= (MainActivity)context;
moved=true;
obj.changeFragment(objectFragTwo, new MyInterfaceJIP() {
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
}
@Override
public void deleteItem() {
moved=true;
obj.changeFragment(objectFragOne,objArrayList);
//notifyItemChanged(position);
}
});
}
});
}
@Override
public int getItemCount() {
return objArrayList.size();
}
class MyViewHolder extends RecyclerView.ViewHolder
{
TextView objectTextView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
objectTextView=itemView.findViewById(R.id.sr_text);
}
}
}
片段 A 的代码
package com.tutorials180.changerecycleritem;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import java.util.ArrayList;
/**
* A simple {@link Fragment} subclass.
*/
public class FragOne extends Fragment {
public FragOne() {
// Required empty public constructor
}
View view;
RecyclerView objectRecyclerView;
ArrayList<String> object;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view=inflater.inflate(R.layout.fragment_frag_one, container, false);
objectRecyclerView=view.findViewById(R.id.RV);
object=new ArrayList<>();
if(getArguments()!=null)
{
Toast.makeText(getContext(), "INside", Toast.LENGTH_SHORT).show();
object=getArguments().getStringArrayList("my");
MyAdapter objectMyAdapter=new MyAdapter(new FragOne(),new FragTwo(),getContext(),object);
objectRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
objectRecyclerView.setAdapter(objectMyAdapter);
objectRecyclerView.setHasFixedSize(true);
objectMyAdapter.notifyDataSetChanged();
}
return view;
}
}
片段二
package com.tutorials180.changerecycleritem;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
/**
* A simple {@link Fragment} subclass.
*/
public class FragTwo extends Fragment {
public FragTwo() {
// Required empty public constructor
}
public MyAdapter.MyInterfaceJIP objectMyInterfaceJIP;
View view,view2;
Button button;
TextView rvBtn;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view=inflater.inflate(R.layout.fragment_frag_two, container, false);
view2=inflater.inflate(R.layout.single_item, container, false);
button=view.findViewById(R.id.btn);
rvBtn=view2.findViewById(R.id.sr_text);
if(getArguments()!=null)
{ objectMyInterfaceJIP=getArguments().getParcelable("interface");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
rvBtn.setBackgroundColor(getContext().getResources().getColor(R.color.colorPrimary));
objectMyInterfaceJIP.deleteItem();
}
});
}
return view;
}
}
解决方案
找到解决方案,在父活动中声明一个变量,并根据该变量值在 Recycler View 中绘制文本视图。这可能不是最终的解决方案,但它是一种解决问题的技巧,但如果有人找到更好的解决方案,他/她不仅仅是欢迎分享。
推荐阅读
- javascript - ag-Grid/Reactjs - 如何在 columnDefs 中获取单元格值
- c++ - 为什么我在 opengl 中的 3D 形状表现得很奇怪?
- rest - 需要在 web api 资源上使用不同的 DTO
- upsert - 如何将“冲突时什么都不做”从 PostgreSQL 迁移到 Snowflake?
- spring-boot - 由于找不到 CacheAspectSupport,CacheAutoConfiguration 不起作用
- node.js - Node.JS 在启动其他命令之前等待 node-cmd 运行命令完成
- c++ - 带有 std::map 的 std::unique_ptr
- python - 是否有一种神奇的方法可以知道通过继承使用基类?
- excel - VBA - 从 Applilcation.InputBox 返回范围或数字
- google-analytics - 从谷歌标签管理器获取自定义变量值到谷歌分析问题