Как обновить фрагмент на счетчике на элементе, выбранном в Android - PullRequest
0 голосов
/ 06 июня 2018

У меня есть фрагмент со счетчиком и просмотр списка, представление списка обновляется, когда пользователь выбирает один из вариантов из счетчика, и я пришел к мысли, что мне нужно обновить фрагмент, когда выбран вариант.но проблема в том, что фрагмент идет в бесконечном цикле, когда я обновляю фрагмент из «onItemSelected», поэтому я сделал «метод refreshFragment» для решения проблемы, но теперь, после того, как пользователь выбирает опцию, первая опция из счетчика не обновляетсяфрагмент снова, все остальные параметры работают хорошо, кроме первого, потому что я не добавил «метод refreshFragment» в этот параметр, потому что, если я добавлю его, он снова перейдет в бесконечный цикл.извините за мой плохой английский, из-за этого я всегда получаю голоса.

    public class MatchesFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener, AdapterView.OnItemSelectedListener {

        private RecyclerView recyclerView;
        private MatchAdapter matchAdapter;
        private ArrayList<Matches> matchCollection;
        SwipeRefreshLayout mSwipeRefreshLayout;

        String apiLink;
        String apiType = "1";


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

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


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

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

            mSwipeRefreshLayout = (SwipeRefreshLayout) getView().findViewById(R.id.swiperefresh);
            mSwipeRefreshLayout.setOnRefreshListener(this);


            if (getArguments() != null) {
                Bundle arguments = getArguments();
                apiLink = arguments.getString("ApiLink");
                apiType = arguments.getString("apiType");
                Toast.makeText(getContext().getApplicationContext(), apiType, Toast.LENGTH_LONG).show();
            }else {
                apiLink = "http://first-api-link";
                Toast.makeText(getContext().getApplicationContext(), "nothing", Toast.LENGTH_LONG).show();
            }

            Spinner spinner = (Spinner) getView().findViewById(R.id.spinner);
            spinner.setOnItemSelectedListener(this);

    // Create an ArrayAdapter using the string array and a default spinner layout
            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
                    R.array.planets_array, android.R.layout.simple_spinner_item);
    // Specify the layout to use when the list of choices appears
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    // Apply the adapter to the spinner
            spinner.setAdapter(adapter);

            ConnectivityManager cm = (ConnectivityManager) getContext().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            String answer = "Internet";
            if (null != activeNetwork) {
                if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                    answer="You are connected to a WiFi Network";
                if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                    answer="You are connected to a Mobile Network";
                init();
                new FetchDataTask().execute();
            }
            else {
                answer = "No internet Connectivity";
                Toast.makeText(getContext().getApplicationContext(), answer, Toast.LENGTH_LONG).show();
            }
        }

        private void init() {
            recyclerView = (RecyclerView) getActivity().findViewById(R.id.matchesRecyclerview);
            recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
            recyclerView.setHasFixedSize(true);
            matchCollection = new ArrayList<>();
            matchAdapter = new MatchAdapter(matchCollection, getActivity());
            recyclerView.setAdapter(matchAdapter);
        }

        @Override
        public void onRefresh() {
            init();
            new FetchDataTask().execute();
        }

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            apiLink = "http://first-api-link";
            switch (position){
//can't add refreshFragment in here it makes infinity lopp
                case 0: apiLink = "first-api-link";
                break;
                case 1:
                    refreshFragment("second-api-link", 2);
                break;
                case 2:
                    refreshFragment("third-api-link", 3);
                    break;
                case 3:
                    refreshFragment("fourth-api-link", 4);
                    break;
                case 4:
                    refreshFragment("fifth-api-link", 5);
                    break;
                case 5:
                    refreshFragment("sixth-api-link", 6);
                    break;
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }

        public class FetchDataTask extends AsyncTask<Void, Void, Void> {
            private String mZomatoString;

            @Override
            protected Void doInBackground(Void... params) {
                HttpURLConnection urlConnection = null;
                BufferedReader reader = null;
                Uri builtUri = Uri.parse(apiLink);
                URL url;
                try {
                    url = new URL(builtUri.toString());
                    urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.setRequestProperty("user-key", "acfd3e623c5f01289bd87aaaff1926c1");
                    urlConnection.connect();

                    InputStream inputStream = urlConnection.getInputStream();
                    StringBuffer buffer = new StringBuffer();
                    if (inputStream == null) {
                        //Nothing to do
                        return null;
                    }

                    reader = new BufferedReader(new InputStreamReader(inputStream));

                    String line;
                    while ((line = reader.readLine()) != null) {
                        buffer.append(line + "\n");
                    }

                    if (buffer.length() == 0) {
                        return null;
                    }

                    mZomatoString = buffer.toString();
                    JSONObject jsonObject = new JSONObject(mZomatoString);

                    Log.v("Response", jsonObject.toString());

                    JSONArray matchArray = jsonObject.getJSONArray("data");


                    //list = new ArrayList<>();
                    for (int i = 0; i < matchArray.length(); i++) {

                        Log.v("BRAD_", i + "");
                        String home_team;
                        String away_team;
                        String home_flag;
                        String away_flag;

                        JSONObject jTeam = (JSONObject) matchArray.get(i);

                        if (apiType == "1"){
                        JSONObject jHomeTeam = (JSONObject) jTeam.getJSONObject("home_team");
                        JSONObject jAwayTeam = (JSONObject) jTeam.getJSONObject("away_team");

                        //get data's from json sent from link
                        home_team = jHomeTeam.getString("name");
                        away_team = jAwayTeam.getString("name");
                        home_flag = jHomeTeam.getString("flag");
                        away_flag = jAwayTeam.getString("flag");
                        }else{
                            //get data's from json sent from link
                            home_team = jTeam.getString("home_team");
                            away_team = jTeam.getString("away_team");
                            home_flag = "https://www.countries-ofthe-world.com/flags-normal/flag-of-Russia.png";
                            away_flag = "https://www.countries-ofthe-world.com/flags-normal/flag-of-Russia.png";
                        }



                        Matches matches = new Matches();
                        matches.setHome_team(home_team);
                        matches.setAway_team(away_team);
                        matches.setHome_flag(home_flag);
                        matches.setAway_flag(away_flag);

                        matchCollection.add(matches);
                        // Stopping swipe refresh
                        mSwipeRefreshLayout.setRefreshing(false);
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                } finally {
                    if (urlConnection != null) {
                        urlConnection.disconnect();
                    }
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (final IOException e) {
                            Log.e("MainActivity", "Error closing stream", e);
                        }
                    }
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                matchAdapter.notifyDataSetChanged();
            }
        }

        public void refreshFragment(String apiLinks, int apiType){
            FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            MatchesFragment fragment = new MatchesFragment();
            Bundle args = new Bundle();
            args.putString("ApiLink", apiLinks);
            args.putString("apiType", String.valueOf(apiType));
            fragment.setArguments(args);
            fragmentTransaction.replace(R.id.linearfr, fragment);
            fragmentTransaction.commit();
        }

    }

1 Ответ

0 голосов
/ 11 июня 2018

Есть несколько вещей, которые следует учитывать при работе с вертушкой.Он всегда имеет выбранное значение, и выбранное значение по умолчанию является первым.Поэтому при создании фрагмента выбирается первое значение в счетчике.

Когда вы вручную открываете раскрывающийся список и выбираете первый элемент в первый раз, он в настоящее время выбирается по умолчанию, и поэтому ваш выбор несрабатывает и при этом обновление не вызывается.Хитрость заключается в том, чтобы добавить фиктивный элемент в качестве первого и игнорировать позицию 0 в onClick (что вы уже делаете).

Бесконечный цикл происходит, потому что спиннер выбирает первый элемент по умолчанию при создании представленияи, следовательно, запускается onClick с позицией 0, который снова вызывает обновление, изменяет фрагмент, создается новый счетчик, выбирается первый элемент и порочный цикл продолжается.

...