将数据传递到新片段,由列表视图内组件的点击事件触发
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 数据附加到 Intent
或 Bundle
中,并轻松获取下一个 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");
}
我有一个列表视图片段,其中填充了来自数组适配器的数据。列表视图的每个项目都包含一个个人资料图像 (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 数据附加到 Intent
或 Bundle
中,并轻松获取下一个 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");
}