简体   繁体   English

具有回收器视图通信的android片段

[英]android fragment with recycler view communication

i have a ListFragment which contain a recycler view and i want to make it when an item is clicked the DetailFragment display beside it in a multi-pane layout i know how to create a multi-pane layout but i don't know how to send data between fragments because i don't where to initialize the click to send data, where should i initialize the on click so it passes data from ListFragment to DetailFragment and display it ?我有一个包含回收器视图的ListFragment ,我想在单击一个项目时创建它DetailFragment在多窗格布局中显示在它旁边 我知道如何创建多窗格布局但我不知道如何发送片段之间的数据,因为我没有在哪里初始化点击以发送数据,我应该在哪里初始化点击以便将数据从ListFragment传递到DetailFragment并显示它? * note: i am getting my data from a dialog fragment * 注意:我从对话片段中获取数据

MainActivity主要活动

public class MainActivity extends AppCompatActivity  {

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


    FragmentManager fm = getSupportFragmentManager();

    Fragment fragment = fm.findFragmentById(R.id.fragment_list_container);

    if (fragment == null) {
        fragment = new ListFragment();
        fm.beginTransaction()
                .add(R.id.fragment_list_container, fragment)
                .commit();
    }
}

}

ListFragment列表片段

 public class ListFragment extends Fragment implements MyDialog.OnInputSelected {


@Override
public void sendInput(String title, Uri imageUri) {
    Wallpaper wallpaper = new Wallpaper(title, imageUri);
    wallpaperList.add(wallpaper);
    passWallpaper.passWallpaperMethod(wallpaper);
}

private List<Wallpaper> wallpaperList;
private RecyclerViewAdapter recyclerViewAdapter;
private RecyclerView recyclerView;
private FloatingActionButton fabOpenDialog;


public ListFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_list, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    fabOpenDialog = view.findViewById(R.id.fab_open_dialog);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    fabOpenDialog.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MyDialog dialog = new MyDialog();
            dialog.setTargetFragment(ListFragment.this, 1);
            dialog.show(getFragmentManager(), "MyDialog");
        }
    });

    wallpaperList = new ArrayList<>();


    recyclerView = getView().findViewById(R.id.recyclerview);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    recyclerViewAdapter = new RecyclerViewAdapter(wallpaperList, getActivity());

    recyclerView.setAdapter(recyclerViewAdapter);

}


 }

RecyclerViewAdapter回收器视图适配器

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

private List<Wallpaper> wallpaperList;
private Context context;

public RecyclerViewAdapter(List<Wallpaper> wallpaperList, Context context) {
    this.wallpaperList = wallpaperList;
    this.context = context;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.recycler_row, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

    Wallpaper wallpaper = wallpaperList.get(position);
    holder.iv.setImageURI(wallpaper.getImageUrl());
    holder.tvTitle.setText(wallpaper.getTitle());


}

@Override
public int getItemCount() {
    return wallpaperList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {

    public View view;
    public ImageView iv;
    public TextView tvTitle;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        view = itemView;

        iv = itemView.findViewById(R.id.row_iv);
        tvTitle = itemView.findViewById(R.id.row_tv_title);


    }
}
}

DetailActivity详细活动

public class DetailsActivity extends AppCompatActivity {

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


    FragmentManager fm = getSupportFragmentManager();

    Fragment fragment = fm.findFragmentById(R.id.details_container);

    if (fragment == null) {
        fragment = new DetailsFragment();

        fm.beginTransaction()
                .add(R.id.details_container, fragment)
                .commit();
    }
}

} }

DetailsFrgament详情片段

public class DetailsFragment extends Fragment {

private TextView tvTitle;
private ImageView ivWallpaper;

public DetailsFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_details, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    tvTitle = view.findViewById(R.id.fragment_details_tv_title);
    ivWallpaper = view.findViewById(R.id.details_fragment_iv_wallpaper);
}

DialogFragment对话片段

public class MyDialog extends DialogFragment implements View.OnClickListener {

public interface OnInputSelected {
    void sendInput(String title, Uri imageUri);
}

public OnInputSelected onInputSelected;

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    try {
        // "getTargetFragment()" instead of "getActivity()"
        onInputSelected = (OnInputSelected) getTargetFragment();
    } catch (ClassCastException e) {
        Log.d("DialogFragment", "Class Cast Exception: " + e.getMessage());
    }
}

TextView yes, no;
private EditText etTitle;
private ImageView imageView;
private Uri imageUri;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    setCancelable(false);
    return inflater.inflate(R.layout.dialog_add_wallpaper, null);

}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    yes = view.findViewById(R.id.dialog_tv_ok);
    no = view.findViewById(R.id.dialog_tv_cancel);
    imageView = view.findViewById(R.id.dialog_iv_add_image);
    imageView.setOnClickListener(this);
    yes.setOnClickListener(this);
    no.setOnClickListener(this);
    etTitle = view.findViewById(R.id.et_add_title);
}

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.setTitle("Title testing");
    return dialog;
}

@Override
public void onClick(View v) {
    if (v.getId() == R.id.dialog_tv_ok) {
        onInputSelected.sendInput(etTitle.getText().toString().trim(), imageUri);
        dismiss();
    } else if (v.getId() == R.id.dialog_tv_cancel) {
        onInputSelected.sendInput("got canceled", null);
        dismiss();
    } else {
        Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);
        imageIntent.setType("image/*");
        startActivityForResult(imageIntent, 1);

    }
}


@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1 && resultCode == Activity.RESULT_OK && data != null &&
            data.getData() != null) {
        imageUri = data.getData();
        imageView.setImageURI(imageUri);
    }
}
}

You can initialize clickListener in onBindViewHolder in RecyclerViewAdapter and inside something like this:您可以在RecyclerViewAdapter中的onBindViewHolder中初始化clickListener ,并在onBindViewHolder中初始化:

holder.iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
((MainActivity) view.getContext()).getFragmentManager().beginTransaction()
                        .replace(R.id.fragment_list_container, new DetailsFrgament())
                        .commit();
            }
        });

For transfering data you can use Bundle要传输数据,您可以使用Bundle

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM