如何将值传递给从另一个片段接收的值的recylerview?

时间:2017-02-19 07:22:31

标签: android android-fragments android-recyclerview android-viewholder

我在我的应用中制作了两个片段。 第一个片段(EditFrag)和第二个片段(ListTable)。我想将第一个片段的值(从第一个片段的EditText)传输到第二个片段的recyclerView。

我应该怎么做.....我找不到合适的文件。 谢谢你的关注!

MainActivity:

public class MainActivity extends AppCompatActivity implements EditFrag.TransferValue{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListTable frag1=new ListTable();
        FragmentManager manager=getSupportFragmentManager();
        FragmentTransaction transaction=manager.beginTransaction();
        transaction.add(R.id.table_value_container,frag1,"fragment");
        transaction.commit();

        EditFrag frag2=new EditFrag();
        FragmentManager manager1=getSupportFragmentManager();
        FragmentTransaction transaction1=manager1.beginTransaction();
        transaction1.add(R.id.table_container,frag2,"fragment_edit");
        transaction1.commit();
    }


    @Override
    public void sendValue(String value) {
        Log.d("ashu","button is pressed");
        ListTable listTable = (ListTable) getSupportFragmentManager().findFragmentById(R.id.table_value_container);
        listTable.receiveValue(value);
    }

}

第二个片段(ListTable):

public class ListTable extends Fragment {
    public TextView myEditText1;
    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();
        Log.d("ashu", "new instance is called :");
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.d("ashu", "oncreata called by inflating: ");

        View view = inflater.inflate(R.layout.fragment_list_table, container, false);
        myEditText1 = (TextView) container.findViewById(R.id.table_value);

        recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        MyAdapter a = new MyAdapter();
        recyclerView.setAdapter(a);
        return view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

    }

    public void receiveValue(String value) {


        myEditText1.setText(value);

    }

    public class MyAdapter extends RecyclerView.Adapter<MyDataViewHolder> {


        @Override
        public MyDataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            Log.d("ashu", "oncreateview holder of adapter ia called");

            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) {


            holder.myEditText.setText("Table: " + position);

        }

        @Override
        public int getItemCount() {
            return 10;
        }
    }

    public class MyDataViewHolder extends RecyclerView.ViewHolder {

        public TextView myEditText;

        public MyDataViewHolder(View itemView) {
            super(itemView);
            Log.d("ashu", "DAta view holder is called: ");
            myEditText = (TextView) itemView.findViewById(R.id.table_value);

        }
    }

}

第一个片段(EditFrag):

public class EditFrag extends Fragment {
    TransferValue SendData;
    EditText inputvalue;
    Button click;


    @Nullable
    @Override
    public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.edit_frag_layout, container, false);
        inputvalue = (EditText) view.findViewById(R.id.edit_text);
        click = (Button) view.findViewById(R.id.click);

        click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String received = inputvalue.getText().toString();

                SendData.sendValue(received);

            }
        });

        return view;

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        try {
            SendData = (TransferValue) context;
        } catch (ClassCastException e) {
            Log.d("ashu", "implement the methods");
            throw new ClassCastException("implemented the methods");
        }
    }

    public interface TransferValue {

        public void sendValue(String value);

    }
}

3 个答案:

答案 0 :(得分:1)

从想要接收值的地方创建fragment2的实例:

public static Fragment2 createInstance(String data) {
        Fragment2 fragment = new Fragment2();
        Bundle bundle = new Bundle();
        bundle.putString("keyword", data);
        fragment.setArguments(bundle);
        return fragment;

    }

并获取如下数据:

Bundle bundle = getArguments();
        if (bundle != null) {
             String data = bundle.getString("data");
        }

答案 1 :(得分:0)

您可以按顺序使用bundle将数据传递给fragment:

示例:

    // Set bundle as arguments to the fragment
    Bundle bundle = new Bundle();
    bundle.putString(MyKey1, MyValue1);
    bundle.putString(MyKey2, MyValue2);

    MyFragment myFragment = new MyFragment();
    myFragment.setArguments(bundle);

片段内的onCreateView:

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.repairer_part_details_fragment, container, false);

        String value1 = getArguments().getString(MyKey1);
        String value2 = getArguments().getString(MyKey2);

        return view;
    }

答案 2 :(得分:0)

有很多方法可以做到这一点。我在上面看到你的代码,并且同时加载了2个片段。我通常使用以下两种方法之一来完成它。

第一个解决方案:您可以使用此link使用可观察的模式来传递2个片段。

第二个解决方案:您可以使用EventBus lib进行通信,这非常简单