使用set方法将数据从Activity发送到Fragment

4

我曾发布过一个问题,关于如何从Activity传递数据到Fragment。后来我了解到,将Parcelable实现到POJO类中是正确的方法。经过一些研究,我也明白了传递数据到Fragment应该使用Bundle而不是Intent。

我的以前的问题 -> 在Android中使用相同的片段但不同的内容

但现在,我的问题是,当卡片视图被点击时,我应该怎么做才能使用set方法显示详细列表(名称、地址、电话)?

为了清楚明白,我想要的是:

  • 当第一个餐厅被点击时,包含详细信息的新意图将被启动。在详细信息片段内,它将显示第一个餐厅的餐厅名称、地址和电话。

有人可以通过展示两组不同的代码来指导我,当两个不同的餐厅卡片视图被点击时,如何设置不同的详细信息?

RestaurantListAdapter.java

我想在onClick下使用if else语句,以便在不同的卡片视图被点击时显示不同的详细信息

public class RestaurantListAdapter extends RecyclerView.Adapter<RestaurantListAdapter.ViewHolder>  {
    List<RestaurantList_Item> items;
    private static ClickListener clickListener;
    private Context context;

    public RestaurantListAdapter(){
        super();
        items = new ArrayList<RestaurantList_Item>();

        // POSITION 1
        RestaurantList_Item restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_anjappar);
        restaurant.setrName("Anjappar Indian Chettinad Restaurant");
        restaurant.setrCuisine("Indian");
        items.add(restaurant);

        // POSITION 2
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_morganfield);
        restaurant.setrName("Morganfield");
        restaurant.setrCuisine("Western");
        items.add(restaurant);

        // POSITION 3
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_nandos);
        restaurant.setrName("Nando's");
        restaurant.setrCuisine("Western");
        items.add(restaurant);

        // POSITION 4
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_shellout);
        restaurant.setrName("Shellout");
        restaurant.setrCuisine("Seafood");
        items.add(restaurant);

        // POSITION 5
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_beyond);
        restaurant.setrName("Beyond Veggie");
        restaurant.setrCuisine("Vegetarian");
        items.add(restaurant);

        // POSITION 6
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_myelephant);
        restaurant.setrName("My Elephant");
        restaurant.setrCuisine("Thai");
        items.add(restaurant);

        // POSITION 7
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_padangkota);
        restaurant.setrName("Nasi Kandar Padang Kota");
        restaurant.setrCuisine("Mamak");
        items.add(restaurant);

    }

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

        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.cardview_restaurant, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
        final RestaurantList_Item restaurant = items.get(position);
        viewHolder.resImage.setImageResource(restaurant.getrImage());
        viewHolder.restaurantName.setText(restaurant.getrName());
        viewHolder.cuisine.setText(restaurant.getrCuisine());
        viewHolder.itemView.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Context context = v.getContext();
//                Toast.makeText(context, "Item clicked with position " +position, Toast.LENGTH_LONG).show();
                if(position == 0){
                    Intent i = new Intent(context, Restaurant.class);
                    context.startActivity(i);
                }
            }
        });
    }

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

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        public ImageView resImage;
        public TextView restaurantName;
        public TextView cuisine;

        public ViewHolder(final View itemView) {
            super(itemView);
            resImage = (ImageView) itemView.findViewById(R.id.resImage);
            restaurantName = (TextView) itemView.findViewById(R.id.restaurantName);
            cuisine = (TextView) itemView.findViewById(R.id.cuisine);
            itemView.setOnClickListener(this);
        }


        @Override
        public void onClick(View v) {
            clickListener.onItemClick(getAdapterPosition(), v);
        }

    }

    public void setOnItemClickListener (ClickListener clickListener){
        RestaurantListAdapter.clickListener = clickListener;
    }

    public interface ClickListener{
        void onItemClick (int position, View v);
    }
}

RestaurantModel.java

这是一个POJO类,包含了get和set方法。我想使用set方法来显示餐厅详细信息。

public class RestaurantModel implements Parcelable{

    //empty constructor
    public RestaurantModel(){}

    //A constructor that initializes the Restaurant object
    public RestaurantModel(String resName, String resAddress, String resPhone, String resCuisine, String resPriceRange){
        this.resName = resName;
        this.resAddress =resAddress;
        this.resPhone = resPhone;
        this.resCuisine = resCuisine;
        this.resPriceRange = resPriceRange;
    }

    //Parcelling the object
    public RestaurantModel(Parcel in){
        String[] data = new String [5];
        in.readStringArray(data);
        this.resName = data[0];
        this.resAddress = data[1];
        this.resPhone = data[2];
        this.resCuisine = data[3];
        this.resPriceRange = data[4];

    }

    // variable main photo
    private int mainImage;

    //variables for details fragment
    private String resName, resAddress, resPhone, resCuisine, resPriceRange;

    //variables for menu fragment
    private int foodPhoto;
    private String foodPrice, foodDescription;

    /*get set methods*/
    public int getMainImage(){
        return mainImage;
    }

    public void setMainImage(int mainImage){
        this.mainImage = mainImage;
    }

    public String getResName(){
        return resName;
    }

    public void setResName(String resName){
        this.resName = resName;
    }

    public String getResAddress(){return resAddress;}

    public void setResAddress(String resAddress){this.resAddress = resAddress;}

    public String getResPhone(){return resPhone;}

    public void setResPhone(String resPhone){this.resPhone = resPhone;}

    public String getResCuisine(){return resCuisine;}

    public void setResCuisine(String resCuisine){this.resCuisine = resCuisine;}

    public String getResPriceRange(){return resPriceRange;}

    public void setResPriceRange(String resPriceRange){this.resPriceRange = resPriceRange;}

    public int getFoodPhoto(){return foodPhoto;}

    public void setFoodPhoto(int foodPhoto){this.foodPhoto = foodPhoto;}

    public String getFoodDescription(){return foodDescription;}

    public void setFoodDescription(String foodDescription){this.foodDescription = foodDescription;}

    public String getFoodPrice(){return foodPrice;}

    public void setFoodPrice(String foodPrice){this.foodPrice = foodPrice;}



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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeStringArray(new String[]{
                this.resName,this.resAddress,this.resPhone, this.resCuisine, this.resPriceRange
        });
    }

    // Creator
    public static final Parcelable.Creator<RestaurantModel> CREATOR = new Parcelable.Creator<RestaurantModel>(){
        @Override
        public RestaurantModel createFromParcel(Parcel source) {
            return new RestaurantModel(source);
        }

        @Override
        public RestaurantModel[] newArray(int size) {
            return new RestaurantModel[size];
        }
    };


}

餐厅.java

这个活动包含当卡片视图被点击时将显示的片段。

public class Restaurant extends AppCompatActivity {

    private TabLayout tabLayout;
    private ViewPager viewPager;

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

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

    }

    private void setupViewPager(ViewPager viewPager){
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new details(), "Details");
        adapter.addFragment(new menu(), "Menu");
        adapter.addFragment(new tableBooking(), "Table booking");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter{

        private final List<Fragment> fragmentList = new ArrayList<>();
        private final List<String> fragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager){
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }

        @Override
        public int getCount() {
            return fragmentList.size();
        }

        public void addFragment (Fragment fragment, String title){
            fragmentList.add(fragment);
            fragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return fragmentTitleList.get(position);
        }
    }
}

Details.java

这个类继承了Fragment,包含餐厅名称、地址和电话等详细信息。

public class details extends Fragment {

    private TextView resName, resAddress, resPhone, resCuisine, resPriceRange;

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


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

/*        resName = (TextView) getView().findViewById (R.id.resName);
        resAddress = (TextView) getView().findViewById (R.id.resAddress);
        resPhone = (TextView) getView().findViewById (R.id.resPhone);
        resCuisine = (TextView) getView().findViewById (R.id.resCuisine);
        resPriceRange = (TextView) getView().findViewById (R.id.resPriceRange);*/



    }

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

}

Homepage.java

public class Homepage extends Activity {

    RecyclerView recyclerView;
    RecyclerView.LayoutManager llm;
    RecyclerView.Adapter adapter;
    private static final String TAG = Homepage.class.getSimpleName();

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

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);

        llm = new LinearLayoutManager(Homepage.this);
        recyclerView.setLayoutManager(llm);

        adapter = new RestaurantListAdapter();
        recyclerView.setAdapter(adapter);

    }
}

编辑:我不确定自己是否做得正确。我创建了多个ArrayList,用于描述不同餐厅的不同详情。我将代码放在了RestaurantListAdapter的onClick方法中。

  @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
        final RestaurantList_Item restaurant = items.get(position);
        viewHolder.resImage.setImageResource(restaurant.getrImage());
        viewHolder.restaurantName.setText(restaurant.getrName());
        viewHolder.cuisine.setText(restaurant.getrCuisine());
        viewHolder.itemView.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                RestaurantModel rAnjappar = new RestaurantModel();
                details fragment = new details();
                Intent i = new Intent(context, Restaurant.class);

                // Array List
                ArrayList<RestaurantModel> a1 = new ArrayList<RestaurantModel>();
                rAnjappar.setResName("Anjappar");
                rAnjappar.setResAddress("Bandar Kinrara");
                rAnjappar.setResPhone("03-80807362");
                rAnjappar.setResCuisine("Mamak");
                rAnjappar.setResPriceRange("RM 30 for 2 person");

                ArrayList<RestaurantModel> a2 = new ArrayList<RestaurantModel>();
                rAnjappar.setResName("Morganfield");
                rAnjappar.setResAddress("Bandar Utama");
                rAnjappar.setResPhone("03-80807362");
                rAnjappar.setResCuisine("Western");
                rAnjappar.setResPriceRange("RM 60 for 2 person");

                // action when card view is clicked
                if(position == 0){
                    Bundle b1 = new Bundle();
                    b1.putParcelableArrayList("anjappar", a1);
                    fragment.setArguments(b1);
                    context.startActivity(i);

                }
            }
        });
    }

如果这是可以接受的,那么我应该在片段代码中检索bundle,对吧?但由于我将拥有多个bundle,我应该如何以正确的方式检索所有bundle呢?


你在哪里使用了RestaurantListAdapter?请粘贴那段代码。 - Wasim K. Memon
@androidnoobdev 你好。我已经粘贴了RestaurantListAdapter的代码。 - jenna_3108
我指的是该类的使用方法?你明白我的意思吗?你在片段或活动中使用了适配器来实现回收视图。 - Wasim K. Memon
@androidnoobdev 哦,对了。抱歉。我已经添加了Homepage.java文件。 - jenna_3108
2个回答

2

好的,据我了解,您可以执行以下操作:

1. 在适配器中添加此方法

public RestaurantList_Item getItem(int pos) {
    return items.get(pos);
}

2. 首页是你的点击监听器活动(希望如此)

public void onItemClick(int position, view v) {
        RestaurantList_Item row_object = adapter.getItem(position); 
        Intent i = new Intent(context, Restaurant.class);
        i.putExtra(Common.Data_Object, row_object);
        startActivity(i);

    }

3. 替换Restaurant类的代码

public class Restaurant extends AppCompatActivity {

    private TabLayout tabLayout;
    private ViewPager viewPager;
    private RestaurantList_Item row_object;

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

        getIntentData(getIntent());

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

    }

    private void getIntentData(Intent i) {
        if (i != null) {

            row_object = i.getParcelableExtra(Common.Data_Object);
        }
    }

    private void setupViewPager(ViewPager viewPager){
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

        Fragment f = new details();
        Bundle arguments = new Bundle();
        arguments.putParcelable(Common.Data_Object, row_object);
        f.setArguments(arguments);

        adapter.addFragment(f, "Details");
        adapter.addFragment(new menu(), "Menu");
        adapter.addFragment(new tableBooking(), "Table booking");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter{

        private final List<Fragment> fragmentList = new ArrayList<>();
        private final List<String> fragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager){
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }

        @Override
        public int getCount() {
            return fragmentList.size();
        }

        public void addFragment (Fragment fragment, String title){
            fragmentList.add(fragment);
            fragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return fragmentTitleList.get(position);
        }
    }
}

4. 从Bundle中获取对象在详情片段中

private void getIntentData(Bundle b)
{
    if (b != null)
    {
         detailObject = b.getParcelable(Common.Data_Object);
    }
}

希望这能有所帮助。

不完全是我想要的。正如您所看到的,我在RestaurantModel.java中有设置方法。我希望每次单击特定餐厅时都能设置名称、地址和电话。根据您的代码,我应该在哪里插入代码,以使用setResName、setResAddress等显示我的餐厅详细信息?无论如何,再次感谢您的帮助。 - jenna_3108

1
您可以使用片段的setArguments()方法,在创建新实例时将餐厅模型类传递到新片段中。 您可以在新创建的片段的onCreate()方法中使用getArguments()获取它。您需要使您的resturantModel.java类可序列化。
 public class RestaurantModel implements Serializable{
   ...
 }

添加数据:-
   Bundle bundle = new Bundle();
   bundle.putSerializable("restaurant", restaurant);
   Fragment1 frag1 = new Fragment1();
   frag1.setArguments(bundle);

获取数据:-
RestauranModel restaurant = (RestauranModel) getArguments().getSerializable("restaurant");

提示:Parcelable和Serializable的区别:https://dev59.com/V3A75IYBdhLWcg3wYYBQ#3323554


我能知道如果我坚持使用Parcelable而不是Serializable会发生什么吗? - jenna_3108

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接