Мне кажется, тут слишком много Активити

352
22 января 2017, 14:58

Предположим, что у меня есть приложение, которое хранит информацию об объектах моего города. У меня есть MainActivity, которая содержит в себе HomeFragment, который, в свою очередь, содержит RecyclerView. Это список категорий объектов (Магазины, торговые центры и т.д.). При нажатии на каждый элемент RecyclerView я попадаю на новую Activity, в которой содержится список CardView (это уже элементы конкретной категории). И, соответственно, при нажатии на каждый элемент CardView я попадаю на новую Activity, в которой содержится описание конкретного объекта. Я уже начал делать так, что при нажатии на каждый элемент RecyclerView, например, я создаю новую Activityи перехожу на нее. И так далее. В итоге получается очень много Activity. Но ведь можно сделать например лишь HomeFragmentсо списком категорий, одну Activity, которая содержит элементы конкретной категории и одну Activity, которая содержит описание конкретного объекта и лишь отображать в них нужные данные. Вопрос в том, как это сделать.

Код HomeFragment:

public class HomeFragment extends Fragment {
    private final String placeNames[] = {
            "Категория 1",
            "Категория 2",
            "Категория 3",
            "Категория 4",
            "Категория 5",
    };
    private final String imageUrls[] = {
            "https://cat1.jpg",
            "httsp://cat2.jpg",
            "https://cat3.jpg",
            "https://cat4.jpg",
            "https://cat5.jpg",              
    };
    public HomeFragment() {}
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        // при нажатии на каждый элемент создаю новую Активити 
        recyclerView.addOnItemTouchListener(
                new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        switch (position) {
                            case 0:
                                getActivity().startActivity(new Intent(getActivity(),
                                        ShopsActivity.class));
                                break;
                            case 1:
                                getActivity().startActivity(new Intent(getActivity(),
                                        ShopCentersActivity.class));
                                break;
                            case 2:
                                getActivity().startActivity(new Intent(getActivity(),
                                        FunActivity.class));
                                break;
                            case 3:
                                getActivity().startActivity(new Intent(getActivity(),
                                        NightLifeActivity.class));
                                break;
                            case 4:
                                getActivity().startActivity(new Intent(getActivity(),
                                        BeautyAndHealthActivity.class));
                                break;
                            case 5:
                                getActivity().startActivity(new Intent(getActivity(),
                                        SportActivity.class));
                                break;
                            default: break;
                        }
                    }
                })
        );
        ArrayList placeItems = prepareData();
        DataAdapter adapter = new DataAdapter(placeItems, getActivity());
        recyclerView.setAdapter(adapter);
        return view;
    }
    private ArrayList prepareData() {
        ArrayList placeItemList = new ArrayList<>();
        for (int i = 0; i < placeNames.length; i++) {
            PlaceItem itemPlace = new PlaceItem();
            itemPlace.setPlaceName(placeNames[i]);
            itemPlace.setImageUrl(imageUrls[i]);
            placeItemList.add(itemPlace);
        }
        return placeItemList;
    }
}

Код конкретной категории ShopsActivity:

public class ShopsActivity extends AppCompatActivity {
    private ShopsAdapter adapter;
    private List<ConcreteObject> objectList;
    @SuppressLint("PrivateResource")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shops);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        if (toolbar != null) {
            toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    onBackPressed();
                }
            });
        }
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.shops_recycler_view);
        objectList = new ArrayList<>();
        adapter = new ShopsAdapter(this, objectList);
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 2);
        if (recyclerView != null) {
            recyclerView.setLayoutManager(layoutManager);
            recyclerView.addItemDecoration(new GridSpacingItemDecoration(2, dpToPx(10), true));
            recyclerView.setItemAnimator(new DefaultItemAnimator());
            recyclerView.setAdapter(adapter);
            // тут я снова создаю новые Активити и перехожу на них
            recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(),
                    recyclerView, new RecyclerTouchListener.ClickListener() {
                @Override
                public void onClick(View view, int position) {
                    switch (position) {
                        case 0:
                            startActivity(new Intent(ShopsActivity.this, OneShop.class));
                            break;
                        case 1:
                            startActivity(new Intent(ShopsActivity.this, TwoShop.class));
                            break;
                        case 2:
                            startActivity(new Intent(ShopsActivity.this, ThreeShop.class));
                            break;
                        case 3:
                            startActivity(new Intent(ShopsActivity.this, FourShop.class));
                            break;
                        case 4:
                            startActivity(new Intent(ShopsActivity.this, FiveShop.class));
                            break;
                        case 5:
                            startActivity(new Intent(ShopsActivity.this, SixShop.class));
                            break;
                        case 6:
                            startActivity(new Intent(ShopsActivity.this, SevenShop.class));
                            break;
                        case 7:
                            startActivity(new Intent(ShopsActivity.this, Eight.class));
                            break;
                        default:
                            break;
                    }
                }
                @Override
                public void onLongClick(View view, int position) {
                }
            }));
        }
        prepareObjects();
        Glide.with(this)
                .load(R.drawable.cover_backdrop)
                .into((ImageView) findViewById(R.id.backdrop));
    }
    @Override
    protected void prepareObjects() {
        objectList.add(new ConcreteObject("Oneshop", 3.9, R.drawable.one));
        objectList.add(new ConcreteObject("TwoShop", 3.5, R.drawable.two));
        objectList.add(new ConcreteObject("ThreeShop", 3.5, R.drawable.three));
        objectList.add(new ConcreteObject("FourShop", 3.5, R.drawable.four));
                  ...
        adapter.notifyDataSetChanged();
    }
}

Код конкретного объекта ConcreteOneActivity:

public class ConcreteOneActivity extends StartConfig {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_concrete_one);
        setToolbar(R.id.toolbar_concrete_one_toolbar);
        setCollapsingToolbar("ConcreteOne", R.id.concrete_one_collapsing_toolbar);
        CustomPagerAdapter adapter = new CustomPagerAdapter(this) {
            @Override
            public Object instantiateItem(ViewGroup collection, int position) {
                LayoutInflater inflater = LayoutInflater.from(context);
                View view = null;
                switch (position) {
                    case 0:
                        view = inflater.inflate(R.layout.concrete_one_information, collection, false);
                        break;
                    case 1:
                        view = inflater.inflate(R.layout.concrete_one_location, collection, false);
                        break;
                    case 2:
                        view = inflater.inflate(R.layout.map_fragment, collection, false);
                        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                                .findFragmentById(R.id.map);
                        mapFragment.getMapAsync(this);
                        break;
                }
                collection.addView(view);
                return view;
            }
            @Override
            public void onMapReady(GoogleMap googleMap) {
                mMap = googleMap;
                LatLng concreteOne = new LatLng(1, 1);
                mMap.addMarker(new MarkerOptions().position(concreteOne).title("ConcreteOne");               
                mMap.moveCamera(CameraUpdateFactory.newLatLng(concreteOne));
            }
        };
        setViewPager(adapter);
    }
}
READ ALSO
Try catch моего теста

Try catch моего теста

Если я правильно понимаю, основной принцип отлова ошибок try catch является в том, чтобы при появлении какой-то определенной - ожидаемой ошибки,...

302
Не запускается Eclipse

Не запускается Eclipse

Работал в Composer (среда на основе Eclipse), программа сама завершила работу и больше не запускается, отображается ошибка, что на скрине

414
Вебхук в ВК или возможна оптимизация LongPoll?

Вебхук в ВК или возможна оптимизация LongPoll?

Делаю клиент VK в виде бота для TelegramСделал обмен сообщениями в разные стороны, чаты

668