【问题标题】:android fragment with recycler view communication带有回收器视图通信的android片段
【发布时间】:2020-03-25 00:06:02
【问题描述】:

我有一个ListFragment,其中包含一个回收器视图,我想在单击一个项目时创建它,它旁边的DetailFragment在多窗格布局中显示我知道如何创建多窗格布局,但我不知道如何在片段之间发送数据,因为我不知道在哪里初始化单击以发送数据,我应该在哪里初始化单击以便它将数据从 ListFragment 传递到 DetailFragment 并显示它? * 注意:我从对话框片段中获取数据

主活动

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();
    }
}

}

列表片段

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


    }
}
}

详细活动

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

对话框片段

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

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

    您可以在onBindViewHolderRecyclerViewAdapter 中初始化clickListener,并在这样的内部:

    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();
                }
            });
    

    要传输数据,您可以使用Bundle

    【讨论】:

    • 如何在那里初始化?正如我一直在视图支架中所做的那样。
    • @hiwadoski 有几种方法可以在适配器中初始化点击,我编辑了答案以显示其中一种
    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多