Autore Topic: Recycler view e interface  (Letto 136 volte)

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Recycler view e interface
« il: 21 Novembre 2016, 17:30:49 CET »
0
Salve ragazzi,ho questo enorme problema...

in pratica sto facendo una chiamata ad un WS che mi restituisce delle ricette(da cucina) in una RecyclerView..adesso cosa devo fare...in pratica rendere clicckabili queste ricette che mi porta in questa RecyclerView..quando cliccko un elemento in questa RW mi riporta in un Fragment nuovo, dove mi restituirà immagine,testo e descrizione.. come posso fare? vi passo un po di codice..
Codice: [Seleziona]
public class FragmentMain extends Fragment {
    public final String POST = "POST";


    private TextView tvJsonItem;
    private String name;
    private View rootView;
    private EditText edit_text_page,edit_text_page_number;
    private ArrayList<Recipe> recipeArrayList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActivity().setContentView(R.layout.activity_main);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView                  = inflater.inflate(R.layout.fragment_fragment_main, container, false);
        Button calculate_recipes  = (Button) rootView.findViewById(R.id.calculate_recipes_button);

        edit_text_page            = (EditText)rootView.findViewById(R.id.edit_text_page);
        edit_text_page_number     = (EditText)rootView.findViewById(R.id.edit_text_page_number) ;


        calculate_recipes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String page,pageNumber;
                edit_text_page            = (EditText)rootView.findViewById(R.id.edit_text_page);
                edit_text_page.setOnClickListener((View.OnClickListener) this);
                page                      = edit_text_page.getText().toString();
                pageNumber                = edit_text_page_number.getText().toString();

                new JSONTask().execute("allrecipes", pageNumber,page);

            }
        });
        return rootView;
    }
    private class JSONTask extends AsyncTask<String, String, String> {
        private TextView Data;

        @Override
        protected String doInBackground(String... params) {

            BufferedReader reader = null;

            try {
                URL url      = new URL ("http://bitdrome-dev.com/projects/algida/backend/web/?r=app/recipe/" + params[0]);
                String result = "";
                if (params[0].equalsIgnoreCase("allrecipes")){
                    result    = getAllRecipes(url, params[1],params[2]);
                }
                return result;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        private String getAllRecipes(URL url, String pageNumber, String page){
            BufferedReader reader = null;

            try {
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod(POST);
                conn.setDoInput(true);
                conn.setDoOutput(true);

                Uri.Builder builder = new Uri.Builder()
                        .appendQueryParameter("page",page)
                        .appendQueryParameter("page_number", pageNumber);
                String query = builder.build().getEncodedQuery();

                OutputStream os       = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(query);
                writer.flush();
                writer.close();
                os.close();
                conn.connect();

                InputStream inStream   = new BufferedInputStream(conn.getInputStream());
                reader                 = new BufferedReader(new InputStreamReader((inStream)));

                StringBuilder response = new StringBuilder();
                String line;

                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                String stringadalWS      = response.toString();
                JSONObject jsobject      = new JSONObject(stringadalWS);
                JSONArray jsonarray      = jsobject.getJSONArray("recipe");

                recipeArrayList = new ArrayList<Recipe>();

                for (int i = 0; i< jsonarray.length(); i++){
                    Recipe myRecipe = new Recipe(jsonarray.getJSONObject(i));
                    recipeArrayList.add(myRecipe);
                }
                return response.toString();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);


            Bundle args = new Bundle();
            args.putSerializable("recipe_list", recipeArrayList);

            FragmentTransaction fragmentTransaction = getActivity().getFragmentManager().beginTransaction();
            RecipeListFragment recipeListFragment = new RecipeListFragment();
            recipeListFragment.setArguments(args);

            fragmentTransaction.replace(R.id.content_fragment, recipeListFragment);
            fragmentTransaction.addToBackStack("Recipe List Fragment").commit();

        }
    }
(mainfragment qui)
        }
Codice: [Seleziona]
import com.example.nicola.algidabartest.myRecycler.RicetteAdapter;

import java.util.ArrayList;

public class RecipeListFragment extends Fragment{
    private View rootView;
    FragmentManager fragmentManager;
    private MainActivity mainActivity;
    private RecyclerView recipesRV;
    private Listener listener = null;
    private LinearLayoutManager layoutManager;
    private ArrayList<Recipe> recipeArray;
    private RicetteAdapter adapter =  null;

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

        Bundle args = getArguments();
        recipeArray = (ArrayList<Recipe>) args.getSerializable("recipe_list");
    }

    @Nullable
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        rootView      = inflater.inflate(R.layout.fragment_recipe_list,container,false);

        recipesRV     = (RecyclerView)rootView.findViewById(R.id.recycler_view);
        layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);

        recipesRV.setLayoutManager(layoutManager);

        setAdapter();

         return rootView;
     }

    private void setAdapter(){
        if (adapter == null)
            adapter = new RicetteAdapter(getActivity(), recipeArray);

        recipesRV.setAdapter(adapter);
    }

    public void setListener(Listener listener) {
    }

    public interface Listener {

    }

}

Codice: [Seleziona]
public class RicetteAdapter extends android.support.v7.widget.RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private ArrayList<Recipe> recipes;
    private Context mContext;

    public RicetteAdapter(Context mContext, ArrayList<Recipe> recipes) {
        this.recipes  = recipes;
        this.mContext = mContext;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context                    = parent.getContext();
        LayoutInflater inflater            = LayoutInflater.from(context);
        View ricetteView = inflater.inflate(R.layout.recipe_item,parent,false);
        RecyclerView.ViewHolder viewHolder = new RecipeViewHolder(ricetteView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
         RecipeViewHolder recipeViewHolder = (RecipeViewHolder) holder;
         String recipeTitle                = recipes.get(position).getTitle();
         recipeViewHolder.recipe_title_tv.setText(recipeTitle);


    }

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

    public static class RecipeViewHolder extends RecyclerView.ViewHolder  {

        public TextView recipe_title_tv;
        public LinearLayout container;

        public RecipeViewHolder(View itemView) {
            super(itemView);
            container       = (LinearLayout)itemView.findViewById(R.id.container);
            recipe_title_tv = (TextView)itemView.findViewById(R.id.recipe_title_tv);

        }
        public void setOnclick(View.OnClickListener onclick){
            recipe_title_tv.setOnClickListener(onclick);
        }
    }

    public interface RecipeDetails{
    public
    }
questo il mio adapter...mi è stato detto di creare un interfaccia..ma in che modo? come posso fare? in generale?
vi ringrazio infinite..
}

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Recycler view e interface
« Risposta #1 il: 22 Novembre 2016, 11:08:45 CET »
0
Una delle possibili soluzioni

1) A RicetteAdapter aggiungi

Codice (Java): [Seleziona]
private OnItemClickListener mClickListener = null;

public void setOnItemClickListener(OnItemClickListener clickListener) {
  mClickListener = clickListener;
}

public interface OnItemClickListener {
  void onItemClick(View view, int position);
}

2) Cambia RecipeViewHolder così:

Codice (Java): [Seleziona]
    //Aggiungo "implements View.OnClickListener"
    public static class RecipeViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener  {

        public TextView recipe_title_tv;
        public LinearLayout container;

        public RecipeViewHolder(View itemView) {
            super(itemView);
            container       = (LinearLayout)itemView.findViewById(R.id.container);
            recipe_title_tv = (TextView)itemView.findViewById(R.id.recipe_title_tv);

            //Indico a quale view associare il listener
            recipe_title_tv.setOnClickListener(this);
        }

        //Questa non serve
        public void setOnclick(View.OnClickListener onclick){
            recipe_title_tv.setOnClickListener(onclick);
        }


        //Aggiungo questo metodo
        @Override
        public void onClick(View view) {
            int position = getAdapterPosition(); //Individuo la posizione
            if (position != RecyclerView.NO_POSITION) { //Verifico che l'item esista
                if (mClickListener != null) {
                  mClickListener.onItemClick(view, position);
                }
            }
        }
    }

3) Imposta il listener:

Codice (Java): [Seleziona]
    private void setAdapter(){
        if (adapter == null) {
            adapter = new RicetteAdapter(getActivity(), recipeArray);
            adapter.setOnItemClickListener(new RicetteAdapter.OnItemClickListener() {
              @Override
              public void onItemClick(View view, int position) {
                //Gestisci il click dell'item alla posizione position
              }
            });
        }

        recipesRV.setAdapter(adapter);
    }
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:Recycler view e interface
« Risposta #2 il: 23 Novembre 2016, 10:19:12 CET »
0
Scusa, ma questo dove lo prendo?
Codice: [Seleziona]
private void setAdapter(){
        if (adapter == null) {
            adapter = new RicetteAdapter(getActivity(), recipeArray);
            adapter.setOnItemClickListener(new RicetteAdapter.OnItemClickListener() {
              @Override
              public void onItemClick(View view, int position) {
                //Gestisci il click dell'item alla posizione position
              }
            });
        }

        recipesRV.setAdapter(adapter);
    }
oppure dove lo dovrei mettere?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Recycler view e interface
« Risposta #3 il: 23 Novembre 2016, 10:28:00 CET »
0
Sostituisce il metodo omonimo in RecipeListFragment
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:Recycler view e interface
« Risposta #4 il: 23 Novembre 2016, 10:40:07 CET »
0
il problema che mi da errore qui:

Codice: [Seleziona]
adapter.setOnItemClickListener(new RicetteAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {

setonclick.. eonitem mi da errore.. così come onItemClick.. non me li fa inserire

Post unito: 23 Novembre 2016, 11:43:53 CET
ok ho risolto,e ti ringrazio tantissimo per l'aiuto,grazie ai tuoi consigli sono riuscito a trovare una strada...

adesso come ultima cosa volevo chiederti:
quando cliccko su una cella della recycler adesso mi riporta in questo metodo:
Codice: [Seleziona]
@Override
    public void onRecipeClick(Recipe recipe) {

adesso la mia domanda è:
come posso aprire un altro Fragment una volta che ho cicckato e sono entrato in questo metodo..dove poi gli passerò l'id della Ricetta che mi restituirà un'immagine e la descrizione di questa determinata ricetta?
« Ultima modifica: 23 Novembre 2016, 11:43:53 CET da Nikococo93, Reason: Merged DoublePost »