Dodanie zdjęć do RecyclerView z drawable

0

Witajcie :)

Mam następujący problem. Chciałbym dodać zdjęcia do mojego RecyclerView (flagi) i niestety nie udaje mi się to . Poniżej wstawiam kod modelu, adaptera i activity. Z góry dziękuję za pomoc.

ADAPTER

package com.example.barto.jsonprototyp.Adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.barto.jsonprototyp.Model.ModelJsona;
import com.example.barto.jsonprototyp.R;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.List;

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.MyViewHolder> implements Filterable {

    private Context context;
    private List<ModelJsona> dataList;
    private List<ModelJsona> filtr;
    private OnitemClickListener mListener;


    public interface OnitemClickListener {
        void onItemClick (int position);
    }

    public void setOnitemClickListener (OnitemClickListener listener)
    {
        mListener=listener;
    }

    public DataAdapter(Context context, List<ModelJsona> dataList) {
        this.context = context;
        this.dataList = dataList;
        this.filtr= dataList;
    }
/// definijca interfejsuy
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_row, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        ModelJsona pozycja = filtr.get(position);


        holder.country_flag.setImageResource(pozycja.getLogo());

        holder.country_name.setText(pozycja.getName());
        holder.country_subregion.setText(pozycja.getSubregion());
        holder.country_nativename.setText(pozycja.getNativeName());
        holder.country_capital.setText(pozycja.getCapital());

    }

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

    }


    public Filter getFilter() {

        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {

                String charString = charSequence.toString();

                if (charString.isEmpty()) {

                    filtr = dataList;
                } else {

                    ArrayList<ModelJsona> listadoprzeszukiwan = new ArrayList<>();

                    for (ModelJsona wyszukiwarka : dataList) {

                        if (
                                wyszukiwarka.getName().contains(charString) ||
                                wyszukiwarka.getName().toLowerCase().contains(charString) ||
                                wyszukiwarka.getSubregion().contains(charString) ||
                                wyszukiwarka.getSubregion().toLowerCase().contains(charString) ||
                                wyszukiwarka.getNativeName().contains(charString) ||
                                wyszukiwarka.getNativeName().toLowerCase().contains(charString) ||
                                wyszukiwarka.getCapital().contains(charString) ||
                                wyszukiwarka.getCapital().toLowerCase().contains(charString))


                                 {

                            listadoprzeszukiwan.add(wyszukiwarka);
                        }
                    }

                    filtr = listadoprzeszukiwan;
                }

                FilterResults wynikiszukania = new FilterResults();
                wynikiszukania.values = filtr;
                return wynikiszukania;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults wynikiszukania) {
                filtr = (ArrayList<ModelJsona>) wynikiszukania.values;
                notifyDataSetChanged();
            }
        };
    }


    public class MyViewHolder extends RecyclerView.ViewHolder {

        public TextView country_name, country_subregion,country_nativename,country_capital;
        public ImageView country_flag;

        public MyViewHolder(View itemView) {
            super(itemView);


           country_flag =(ImageView) itemView.findViewById(R.id.image_view);

            country_name = (TextView) itemView.findViewById(R.id.country_name);
            country_subregion = (TextView) itemView.findViewById(R.id.country_subregion);
            country_nativename = (TextView) itemView.findViewById(R.id.country_nativename);
            country_capital= (TextView) itemView.findViewById(R.id.country_capital);


           itemView.setOnClickListener((new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mListener !=null){
                        int position = getAdapterPosition();
                        String name = filtr.get(position).getName();
                        for (int i=0 ; i <dataList.size() ; i++ ){
                            if(name.equals(dataList.get(i).getName())){
                                position = i;
                                break;
                            }
                        }
                        if (position != RecyclerView.NO_POSITION) {
                            mListener.onItemClick(position);
                        }
                    }
                }
            }));

        }
    }


}

MODEL

  private int logo;


    public ModelJsona  (int logo) {
        this.logo= logo;
    }

    public int getLogo() {
        return logo;
    }

    public void setLogo(int logo) {
        this.logo = logo;
    }

ACTIVITY

public class MainActivity extends AppCompatActivity implements DataAdapter.OnitemClickListener {

    // Deklaracja zmiennych uzywanych potem do przesyłania danych do innej aktywnosci (details)
    public static final String EXTRA_COUNTRY_NAME = "country_name";
    public static final String EXTRA_COUNTRY_SUBREGION = "country_region";
    public static final String EXTRA_COUNTRY_NATIVE_NAME = "country_nativename";
    public static final String EXTRA_COUNTRY_CAPITAL = "country_capital";


    String answer;
    /// JSON DEKLARACJA - dane z restocountries
    private RecyclerView recyclerView;
    private DataAdapter dataAdapter;
    private List<ModelJsona> dataArrayList;
    private ProgressDialog progressDialog;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
// Progress Dialog wywołujacy sie podczas pobierania jsona
        progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setMessage("Loading Data... Please wait...");
        progressDialog.setIndeterminate(false);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setCancelable(false);
        progressDialog.show();

// Sprawdzanie połączenia z internetem
        ConnectivityManager cm = (ConnectivityManager) getApplicationContext()
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (null != activeNetwork) {
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                answer = "Aplikacja jest połączona z siecią WIFI";
            if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                answer = "Aplikacja jest połączona z danymi komórkowymi";

        } else
            answer = "Brak połączenia z internetem!!!!!!!!";
        Toast.makeText(getApplicationContext(), answer, Toast.LENGTH_LONG).show();


    }


    private void initViews() {
        recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

        loadJSON();

    }


    // Metoda odpowiedzialna za pobierania danych z restcountries
    private void loadJSON() {
        dataArrayList = new ArrayList<>();


        Retrofit retrofit = new Retrofit.Builder().baseUrl("https://restcountries.eu/").addConverterFactory(GsonConverterFactory.create()).build();

        RequestInterface requestInterface = retrofit.create(RequestInterface.class);

        Call<List<ModelJsona>> call = requestInterface.getJSON();

        call.enqueue(new Callback<List<ModelJsona>>() {


            @Override
            public void onResponse(Call<List<ModelJsona>> call, Response<List<ModelJsona>> response) {
                dataArrayList = response.body();
                recyclerView.setHasFixedSize(true);
                dataAdapter = new DataAdapter(getApplicationContext(), dataArrayList);


                recyclerView.setAdapter(dataAdapter);
                dataAdapter.setOnitemClickListener(MainActivity.this);
                flagi();
                dataAdapter.notifyDataSetChanged();
                progressDialog.dismiss();


            }

            @Override
            public void onFailure(Call<List<ModelJsona>> call, Throwable t) {
                Log.e("Error", t.getMessage());
                progressDialog.dismiss();
            }
        });}


    private void flagi() {
        ModelJsona pizza = new ModelJsona(R.drawable.and);
        dataArrayList.add(pizza);
        pizza = new ModelJsona(R.drawable.afg);
        dataArrayList.add(pizza);

    }


// Deklaracja menu z paskiem do wyszkuwiania danych
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main_menu, menu);

        MenuItem search = menu.findItem(R.id.search);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(search);
        search(searchView);
        return true;
    }

// Metoda odpowiedzialna za prawidłowe zaznaczenie danych
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        return super.onOptionsItemSelected(item);
    }
// wyszukiwania danych
    private void search(SearchView searchView) {

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {

                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                dataAdapter.getFilter().filter(newText);
                return true;
            }
        });
    }

// przesyłanie danych do aktywności scczegółowej
    @Override
    public void onItemClick(int position) {
        Intent detailsIntent = new Intent(this,Details.class);
        JsonMain click = dataArrayList.get(position);


        detailsIntent.putExtra(EXTRA_COUNTRY_NAME,click.getName());
        detailsIntent.putExtra(EXTRA_COUNTRY_SUBREGION,click.getSubregion());
        detailsIntent.putExtra(EXTRA_COUNTRY_NATIVE_NAME,click.getNativeName());
        detailsIntent.putExtra(EXTRA_COUNTRY_CAPITAL,click.getCapital());


        startActivity(detailsIntent);

    }



}
0

no dobra ale w czym jest problem, co sie dzieje na ekranie, masz jakis blad w logach?

0

Nie, zero błędów. Chce dodać obrazki do wyniku metody pobierającej JSON(która wykonuje się prawidłowo)

0

Z technicznego punktu widzenia, nie widzę czemu miałoby nie wyświetlać, ale kod jest takim zbiorem WTFów, że ciężko o czymkolwiek rozsądnie wnioskować. Może sam layout dla ViewHoldera jest skopany. No i też głupia ewentualność - sprawdzasz na końcu RecyclerView, że nie ma tych flag wyświetlonych, prawda?

0

Nie layout jest ok, uzupełniłem powyżej cały kod Activity.

0

No to albo masz zły layout albo nie sprawdzasz tego na końcu swojego RecyclerView tylko na początku. Skopiowałem Twój kod 1:1 (do ModelJsona musiałem dodać tylko pola, bo nie wrzuciłeś całości) i u mnie flagi widać.

A tak poza tym ten kod jest naprawdę bardzo źle napisany, więc popracuj przede wszystkim nad nazewnictwem zmiennych i klas, hermetyzacją, wyciekami pamięci (np. nigdzie nie zatrzymujesz zapytania do serwisu w przypadku śmierci Activity), wydajnością (np. niepotrzebnie przy każdym utworzeniu Activity tworzysz Retrofita i interfejs dla serwisu, użyj DiffUtils zamiast notifyDataSetChange() - a jak nie chcesz DiffUtils to informuj adapter o zmianach w liście inkrementalnie a nie o całości za każdym razem), SRP i pewnie nad innymi rzeczami.

0

Dzięki za wskazówki Michał . Mógłbyś mi w prywatnej wiadomości albo na jakiś upload wrzucić kod, który u Ciebie działa? Może porównując dojdę do błędu.

0

Nie widzę sensu, bo kod jest identyczny. Poza layoutami, których nie wrzuciłeś i sam musiałem je zrobić.

0

OK, dzięki za twój poświęcony czas

1 użytkowników online, w tym zalogowanych: 0, gości: 1