将数据传递到新片段,由列表视图内组件的点击事件触发

Passing of data to a new fragment, fired by the on click event of a component inside the listview

我有一个列表视图片段,其中填充了来自数组适配器的数据。列表视图的每个项目都包含一个个人资料图像 (ImageView) 和描述 (TextView)。我想这样做,当您在列表视图中按下图像时,另一个片段应该替换列表视图片段,并且后期片段应该用被按下图像所在的列表项中包含的数据填充。到目前为止,我所做的是为 CustomAdaptor class 中的图像实现点击监听器,它成功地设法获取列表视图中被点击项目的索引并从中获取信息。但是它无法使用从图像点击中检索到的数据填充新片段。

这是我的自定义适配器:

public class PostListAdaptor extends ArrayAdapter<Post>{

private Context context;
private ArrayList<Post> posts;

public PostListAdaptor(Context context, ArrayList<Post> objects)
{
    super(context, R.layout.item_post, objects);

    this.context = context;
    this.posts = objects;
}


@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View row = inflater.inflate(R.layout.item_post, parent, false);

    ImageView profileimage = (ImageView) row.findViewById(R.id.profileimage);
    TextView usernametext = (TextView) row.findViewById(R.id.usernametext);
    TextView datetext = (TextView) row.findViewById(R.id.datetext);
    TextView likestext = (TextView) row.findViewById(R.id.likestext);
    ImageView postimage = (ImageView) row.findViewById(R.id.postimage);
    TextView posttitletext = (TextView) row.findViewById(R.id.posttitletext);
  Picasso.with(context).load(posts.get(position).getImage()).into(postimage);
    Picasso.with(context).load(posts.get(position).getUserimage()).into(profileimage);
    datetext.setText(posts.get(position).getDate());
    usernametext.setText(posts.get(position).getUser());
    likestext.setText(Integer.toString(posts.get(position).getLikes()));
    posttitletext.setText(posts.get(position).getTitle());


    postimage.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view) {

            ArrayAdapter<Post> postArrayAdapter;
            ArrayList<Post> onepostlist= new ArrayList<Post>();
            MainActivity.displayAllPosts=false;

            View parentRow = (View) view.getParent();
            ListView listView1 = (ListView) parentRow.getParent();

            final int position = listView1.getPositionForView(parentRow);

            FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
            FragmentPost post = new FragmentPost();
            ft.replace(R.id.fragmentContainer, post);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            ft.addToBackStack("post");
            ft.commit();

        }
    });

    return row;
}

Use can pass data To fragment using bundle.像下面这样更新您的代码

        Bundle bundle = new Bundle();
        bundle.putString(key, value);
        FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
        FragmentPost post = new FragmentPost();
        post.setArguments(bundle);
        ft.replace(R.id.fragmentContainer, post);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack("post");
        ft.commit();

并在您的片段中获得这样的价值

       Bundle bundle = getActivity().getArguments();
       if (bundle != null) {
       String data = bundle.getString(key, defaultValue);
       }

首先,每当我们要传递自定义class的数据时,最好将class设为Parcelable(其他选项,你可以使用Serializable)。因此,我们可以轻松地将可打包的 class 数据附加到 IntentBundle 中,并轻松获取下一个 activity 或片段。

因此,让您的 Post class 可包裹 如下所示:

public class Post implements Parcelable {
String date;
String user;
String image;
String userImage;
String likes;
String title;

public Post() {
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public String getUser() {
    return user;
}

public void setUser(String user) {
    this.user = user;
}

public String getImage() {
    return image;
}

public void setImage(String image) {
    this.image = image;
}

public String getUserImage() {
    return userImage;
}

public void setUserImage(String userImage) {
    this.userImage = userImage;
}

public String getLikes() {
    return likes;
}

public void setLikes(String likes) {
    this.likes = likes;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public Post(Parcel parcel) {
    date = parcel.readString();
    user = parcel.readString();
    image = parcel.readString();
    userImage = parcel.readString();
    likes = parcel.readString();
    title = parcel.readString();
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int flags) {
    parcel.writeString(date);
    parcel.writeString(user);
    parcel.writeString(image);
    parcel.writeString(userImage);
    parcel.writeString(likes);
    parcel.writeString(title);
}

public static final Parcelable.Creator<Post> CREATOR = new
        Parcelable.Creator<Post>() {
            public Post createFromParcel(Parcel in) {
                return new Post(in);
            }

            public Post[] newArray(int size) {
                return new Post[size];
            }
        };
}

现在使用Bundle,我们可以在片段Add/replace操作期间向片段发送数据。

对于适配器中 onClick 代码下方的更改 final int position = listView1...:-

    //Attach data using Bundle
    Bundle postBundle = new Bundle();
    postBundle.putParcelable("SELECTED_POST", posts.get(position));

    FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
    FragmentPost post = new FragmentPost();
    post.setArguments(postBundle);              //Add this line to attach data
    ft.replace(R.id.fragmentContainer, post);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack("post");
    ft.commit();

然后我们可以在 onCreate() 片段中捕获该数据,如下所示,并根据需要使用它:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle dataBundle = getArguments();
    Post selectedPost = dataBundle.getParcelable("SELECTED_POST");
}