如何在Recycler适配器中添加片段?

时间:2018-03-13 05:50:05

标签: android android-layout android-studio android-fragments

问题是我想在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);
        }
    }
 }

3 个答案:

答案 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);
}