如何在片段的数据持有者中设置值?
How to set value in the dataholder of fragment?
我制作了第二个片段,其中我收到了第一个片段的值。但问题是我无法将接收到的设置为第二个片段的文本视图。
我用的是Log.d()
;方法来检查,但我发现 databindholder 从未被调用过:
Issue 1: databindholder is not called
Issue 2: can't set the value to the textview of 2nd fragment
感谢您的关心!
public class ListTable extends Fragment {
private RecyclerView recyclerView;
public ListTable() {
// Required empty public constructor
}
public static ListTable newInstance(String param1, String param2) {
ListTable fragment = new ListTable();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list_table, container, false);
recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
MyAdapter a = new MyAdapter();
// a.notifyDataSetChanged();
recyclerView.setAdapter(a);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
public void receiveValue(String value) {
int result = Integer.parseInt(value);
Bundle bundle = new Bundle();
bundle.putInt("value", result);
ListTable listTable = new ListTable();
listTable.setArguments(bundle);
MyAdapter b=new MyAdapter();
b.notifyDataSetChanged();
// a.notifiedatachanged
Log.d("ashu", "value recived :" + value);
}
public class MyAdapter extends RecyclerView.Adapter<MyDataViewHolder> {
@Override
public MyDataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.fragment_list_table, parent, false);
return new MyDataViewHolder(view);
}
@Override
public void onBindViewHolder(MyDataViewHolder holder, int position) {
if (getArguments() != null) {
int value1 = getArguments().getInt("value");
Log.d("ashu", "the value received inthe bindholder is " + value1);
holder.myEditText.setText("Table is: " + position * value1);
}
}
@Override
public int getItemCount() {
return 10;
}
}
public class MyDataViewHolder extends RecyclerView.ViewHolder {
public TextView myEditText;
public MyDataViewHolder(View itemView) {
super(itemView);
myEditText = (TextView) itemView.findViewById(R.id.table_value);
}
}
}
您不必显式声明一个空的构造函数,如果您没有声明任何其他构造函数,Java 会为您做这件事。
你的整个结构是错误的,你正在接收 ListTable 中的值,但是你创建了一个新的 ListTable 实例!?
您应该做的是让您的 activity 从您的第一个片段(通过接口)接收值,如果您已经引用它,则从您的 activity 直接将值设置为 ListTable或使用 ListTable.newInstance();
添加新的 ListTable 片段
使用构造函数将数据列表传递给 MyAdapter
并使用该列表获取每个位置的值。像这样...
public class MyAdapter extends RecyclerView.Adapter<MyDataViewHolder> {
private List<YourObject> items;
public MyAdapter(List<YourObject> items) {
this.items = items;
}
@Override
public MyDataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.fragment_list_table, parent, false);
return new MyDataViewHolder(view);
}
@Override
public void onBindViewHolder(MyDataViewHolder holder, int position) {
YourObject val = items.get(position);
if(val!=null){
//do something
}
}
@Override
public int getItemCount() {
return items.size();
}
}
然后在片段中,像这样调用...
List<YourObject> items = ..... (generate anyway you need)
MyAdapter a = new MyAdapter(items);
recyclerView.setAdapter(a);
由于未正确使用setArguments(),未调用Data Binder。对于您的情况,您可以简单地在适配器中创建一个方法并传递该值。
你应该像这样在 Fragments 中使用 setArguments
Fragment fragment2 = new FragmentB();
fragment2.setArguments(bundle);
getFragmentManager.beginTransaction().replace(R.id.holder, fragment2).commit();
像这样使用 getArguments
class FragmentB extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_view, container, false);
Bundle data = getArguments();
if (data != null) {
//TODO - retrieve all your data
}
// Create view
// Create your adapter
return view;
}
}
只需添加以下代码:
getFragmentManager.beginTransaction().replace(R.id.holder, fragment2).commit();
它应该添加到你在 receiveValue 函数中创建第二个片段的对象的地方!
public void receiveValue(String value) {
int result = Integer.parseInt(value);
Bundle bundle = new Bundle();
bundle.putInt("value", result);
ListTable listTable = new ListTable();
listTable.setArguments(bundle);
getFragmentManager().beginTransaction().replace(R.id.table_value_container, listTable).commit();
}
我制作了第二个片段,其中我收到了第一个片段的值。但问题是我无法将接收到的设置为第二个片段的文本视图。
我用的是Log.d()
;方法来检查,但我发现 databindholder 从未被调用过:
Issue 1: databindholder is not called
Issue 2: can't set the value to the textview of 2nd fragment
感谢您的关心!
public class ListTable extends Fragment {
private RecyclerView recyclerView;
public ListTable() {
// Required empty public constructor
}
public static ListTable newInstance(String param1, String param2) {
ListTable fragment = new ListTable();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list_table, container, false);
recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
MyAdapter a = new MyAdapter();
// a.notifyDataSetChanged();
recyclerView.setAdapter(a);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
public void receiveValue(String value) {
int result = Integer.parseInt(value);
Bundle bundle = new Bundle();
bundle.putInt("value", result);
ListTable listTable = new ListTable();
listTable.setArguments(bundle);
MyAdapter b=new MyAdapter();
b.notifyDataSetChanged();
// a.notifiedatachanged
Log.d("ashu", "value recived :" + value);
}
public class MyAdapter extends RecyclerView.Adapter<MyDataViewHolder> {
@Override
public MyDataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.fragment_list_table, parent, false);
return new MyDataViewHolder(view);
}
@Override
public void onBindViewHolder(MyDataViewHolder holder, int position) {
if (getArguments() != null) {
int value1 = getArguments().getInt("value");
Log.d("ashu", "the value received inthe bindholder is " + value1);
holder.myEditText.setText("Table is: " + position * value1);
}
}
@Override
public int getItemCount() {
return 10;
}
}
public class MyDataViewHolder extends RecyclerView.ViewHolder {
public TextView myEditText;
public MyDataViewHolder(View itemView) {
super(itemView);
myEditText = (TextView) itemView.findViewById(R.id.table_value);
}
}
}
您不必显式声明一个空的构造函数,如果您没有声明任何其他构造函数,Java 会为您做这件事。
你的整个结构是错误的,你正在接收 ListTable 中的值,但是你创建了一个新的 ListTable 实例!?
您应该做的是让您的 activity 从您的第一个片段(通过接口)接收值,如果您已经引用它,则从您的 activity 直接将值设置为 ListTable或使用 ListTable.newInstance();
添加新的 ListTable 片段使用构造函数将数据列表传递给 MyAdapter
并使用该列表获取每个位置的值。像这样...
public class MyAdapter extends RecyclerView.Adapter<MyDataViewHolder> {
private List<YourObject> items;
public MyAdapter(List<YourObject> items) {
this.items = items;
}
@Override
public MyDataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.fragment_list_table, parent, false);
return new MyDataViewHolder(view);
}
@Override
public void onBindViewHolder(MyDataViewHolder holder, int position) {
YourObject val = items.get(position);
if(val!=null){
//do something
}
}
@Override
public int getItemCount() {
return items.size();
}
}
然后在片段中,像这样调用...
List<YourObject> items = ..... (generate anyway you need)
MyAdapter a = new MyAdapter(items);
recyclerView.setAdapter(a);
由于未正确使用setArguments(),未调用Data Binder。对于您的情况,您可以简单地在适配器中创建一个方法并传递该值。
你应该像这样在 Fragments 中使用 setArguments
Fragment fragment2 = new FragmentB();
fragment2.setArguments(bundle);
getFragmentManager.beginTransaction().replace(R.id.holder, fragment2).commit();
像这样使用 getArguments
class FragmentB extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_view, container, false);
Bundle data = getArguments();
if (data != null) {
//TODO - retrieve all your data
}
// Create view
// Create your adapter
return view;
}
}
只需添加以下代码:
getFragmentManager.beginTransaction().replace(R.id.holder, fragment2).commit();
它应该添加到你在 receiveValue 函数中创建第二个片段的对象的地方!
public void receiveValue(String value) {
int result = Integer.parseInt(value);
Bundle bundle = new Bundle();
bundle.putInt("value", result);
ListTable listTable = new ListTable();
listTable.setArguments(bundle);
getFragmentManager().beginTransaction().replace(R.id.table_value_container, listTable).commit();
}