问题是我想在recycleler视图中添加片段每行数据 并尝试在XML中添加片段并在视图持有者中设置。 但是出现错误,表示Duplicate id 0x7f070075,tag null或parent id 0xffffffff with SomeFragment的另一个片段。 并尝试了第二种方式,即在视图中动态添加帧布局,并为每个帧布局添加唯一ID并动态添加片段。问题是找不到视图的错误
Caused by: java.lang.IllegalArgumentException: Binary XML file line #0: Duplicate id 0x7f070075, tag null, or parent id 0xffffffff with another fragment for com.example.my.samefragmenttest.TestFragment
尝试调试时,工作正常但不是运行时间.. 我的问题是我想回收列表行中的片段。 有任何想法吗??谢谢..
抱歉,这是我的代码public class MainActivity extends AppCompatActivity {
RecyclerViewPager mRecyclerView;
List<Person> peopleList = new ArrayList<Person>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initialData();
mRecyclerView = (RecyclerViewPager) findViewById(R.id.list);
mRecyclerView.setLayoutManager(new
LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
mRecyclerView.hasFixedSize();
final RecyclerAdapter recyclerAdapter = new
RecyclerAdapter(this,peopleList,this.getSupportFragmentManager());
mRecyclerView.setAdapter(recyclerAdapter);
}
}
/**
* Created by MY on 2018-03-11.
*/
public class RecyclerAdapter extends
RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
List<Person> personList;
Context context;
FragmentManager fragmentManager;
int count=0;
public RecyclerAdapter(Context context, List<Person> peopleList,
FragmentManager supportFragmentManager) {
this.personList = peopleList;
this.context = context;
this.fragmentManager = supportFragmentManager;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
// Inflate the custom layout
View view = inflater.inflate(R.layout.row_item, parent, false);
// Return a new holder instance
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Person person = personList.get(position);
// Set item views based on your views and data model
holder.id.setText(String.valueOf(person.getId()));
holder.testFragment = new TestFragment();
}
@Override
public int getItemCount() {
return personList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView id;
LinearLayout linearLayout;
FrameLayout frameLayout;
TestFragment testFragment;
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
public ViewHolder(View itemView) {
super(itemView);
id = (TextView)itemView.findViewById(R.id.txt_id);
linearLayout = (LinearLayout)itemView.findViewById(R.id.linear);
frameLayout = (FrameLayout)itemView.findViewById(R.id.test_frame);
if(testFragment==null){
fragmentManager.findFragmentByTag(TestFragment.TAG);
// TestFragment.newInstance(fragmentManager);
}
}
}
答案 0 :(得分:2)
从API 17开始,您可以使用view.generateViewId()获取片段的动态ID,而不会与现有ID发生交集错误。
public class ViewHolderInds extends RecyclerView.ViewHolder {
...
public final int frameId; //Unique identifier for ValueFrame
...
public ViewHolderInds(View view) {
super(view);
...
frameId = view.generateViewId();
((FrameLayout) view.findViewById(R.id.valueFrame)).setId(frameId);
...
}
}
然后,在RecyclerView.Adapter中,我们使用ViewHolderInds中的frameId。
@Override
public void onBindViewHolder(@NonNull ViewHolderInds holder, int position) {
getActivity().getSupportFragmentManager().
beginTransaction().
replace(holder.frameId, EditFragment.newInstance(...)).
commit();
...
答案 1 :(得分:0)
我认为您不能将片段用作Recycler View。
请参阅此处。 Reference
答案 2 :(得分:0)
您必须使用片段容器(Viewgroup)创建布局并从onCreateViewHolder()创建片段并将片段添加到布局中。在R.layout.item_fragment
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
在您的回收站视图适配器中,您可以这样做,
在构造函数中,
public RecyclerViewConstructor(Activity hostActivity) {
super();
this.hostActivity = hostActivity;
lastClickTime = 0;
}
Activity host
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(mContext).inflate(R.layout.item_fragment, null);
return new ViewHolder(rootView);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
YourFragment yourFragment = YourFragment.newInstance();
FragmentManager fm = hostActivity.getSupportFragmentManager();
fm.addOnBackStackChangedListener(this);
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_container, fragment, tag);
}