RecyclerView не показывает элементы - PullRequest
0 голосов
/ 02 октября 2018

У меня проблема, почему RecyclerView не показывает элементы, которые я не знаю, почему не показывает элементы.

json url

[
  {
    "id": 1,
    "title": "English",
    "photo": "en.png",
    "shortcut": "en"
  },
  {
    "id": 2,
    "title": "Spanish",
    "photo": "es.png",
    "shortcut": "es"
  },
  {
    "id": 3,
    "title": "Arabic",
    "photo": "ar.png",
    "shortcut": "ar"
  },
  {
    "id": 4,
    "title": "Russian",
    "photo": "ru.png",
    "shortcut": "ru"
  },
  {
    "id": 5,
    "title": "Portuguese",
    "photo": "pt.png",
    "shortcut": "pt"
  },
  {
    "id": 6,
    "title": "French",
    "photo": "fr.png",
    "shortcut": "fr"
  },
  {
    "id": 7,
    "title": "Turkish",
    "photo": "tr.png",
    "shortcut": "tr"
  }
]

активность

public class CategoriesActivity extends AppCompatActivity {

    //mapping
    @BindView(R.id.rv_categories)
    RecyclerView rv_categories;

    CategoriesAdapter categoriesAdapter;
    List<CategoriesModel> categoriesModels = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_categories);
        ButterKnife.bind(CategoriesActivity.this);
        //set data
        setData();
    }

    private void setData() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("***Stackoverflow")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        RetrofitService retrofitService = retrofit.create(RetrofitService.class);
        Call<List<CategoriesModel>> call = retrofitService.get_categories();
        call.enqueue(new Callback<List<CategoriesModel>>() {
            @Override
            public void onResponse(Call<List<CategoriesModel>> call, Response<List<CategoriesModel>> response) {
                List<CategoriesModel> list = response.body();
                for (CategoriesModel data : list) {
                    categoriesModels.add(new CategoriesModel(data.id, data.title, data.photo, data.shortcut));
                }
                rv_categories.setLayoutManager(new GridLayoutManager(CategoriesActivity.this, 2));
                categoriesAdapter = new CategoriesAdapter(CategoriesActivity.this, categoriesModels);
                rv_categories.setAdapter(categoriesAdapter);
            }
            @Override
            public void onFailure(Call<List<CategoriesModel>> call, Throwable t) {

            }
        });
    }

}

модель

public class CategoriesModel {

    @SerializedName("id")
    public String id;
    @SerializedName("title")
    public String title;
    @SerializedName("photo")
    public String photo;
    @SerializedName("shortcut")
    public String shortcut;

    public CategoriesModel(String id, String title, String photo, String shortcut) {
        this.id = id;
        this.title = title;
        this.photo = photo;
        this.shortcut = shortcut;
    }
}

interface

public interface RetrofitService {

    //Categories
    @GET("Categories/get_categories.php")
    Call<List<CategoriesModel>> get_categories();

}

Адаптер

public class CategoriesAdapter extends RecyclerView.Adapter<CategoriesAdapter.ViewHolder> {

    Context context;
    List<CategoriesModel> categoriesModels;

    public CategoriesAdapter(Context context, List<CategoriesModel> categoriesModels) {
        this.context = context;
        this.categoriesModels = categoriesModels;
    }

    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_categories, viewGroup, false);
        ViewHolder adapterHolder = new ViewHolder(view);
        return adapterHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        CategoriesModel categoriesModel = categoriesModels.get(i);
        //set photo
        Picasso.get().load(viewHolder.url + categoriesModel.photo).into(viewHolder.img_background);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        //mapping
        @BindView(R.id.img_background)
        ImageView img_background;
        @BindString(R.string.categories)
        String url;

        public ViewHolder(View view) {
            super(view);
            ButterKnife.bind(context, view);
        }

    }

}

row_categories

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/img_background"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="5dp">

</ImageView>

activity_categories.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CategoriesActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_categories"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

Со вчерашнего дняЯ пытался выяснить, где проблема, и я не нашел проблему ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, я надеюсь, что помогите мне большое спасибо

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Убедитесь, что вы предварительно установили размер изображения.Потому что загруженное изображение соответствует его размеру, если вы не объявите что-то еще.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="50dp"
   android:layout_height="50dp">

   <ImageView
      android:id="@+id/img_background"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_margin="5dp">
</ImageView>

И выберите другой URL-адрес изображения в Google или что-то еще, что показывает изображение, только когда вы переходите по ссылке наубедитесь, что ваши параметры URL неверны.

0 голосов
/ 02 октября 2018

Вы можете избежать этого кода

for (CategoriesModel data : list) {
      categoriesModels.add(new CategoriesModel(data.id, data.title, data.photo, data.shortcut));
}

И сделать что-то вроде categoriesModels.addAll(list);

В вашем ViewHolder вам это не нужно

@BindString(R.string.categories)
String url;

Так какваш R.layout.row_categories содержит только ImageView.

Попробуйте изменить row_categories.xml на этот:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="50dp"
    android:layout_height="50dp">

    <ImageView
    android:id="@+id/img_background"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="5dp">

</ImageView>

</LinearLayout>

Также ваш RecyclerView попытается изменить высоту на wrap_content

 <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_categories"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

Если не сработало, попробуйте изменить onCreate() на этот:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_categories);
    ButterKnife.bind(CategoriesActivity.this);
    rv_categories.setHasFixedSize(true);
    rv_categories.setLayoutManager(new GridLayoutManager(CategoriesActivity.this, 2));
    setData();
}

РЕДАКТИРОВАТЬ

Я думаю, что проблема здесь

public class CategoriesModel {

    @SerializedName("id")
    public String id;
    @SerializedName("title")
    public String title;
    @SerializedName("photo")
    public String photo;
    @SerializedName("shortcut")
    public String shortcut;

    public CategoriesModel(String id, String title, String photo, String shortcut) {
        this.id = id;
        this.title = title;
        this.photo = photo;
        this.shortcut = shortcut;
    }
}

И проблема здесь

Picasso.get().load(viewHolder.url + categoriesModel.photo).into(viewHolder.img_background);

Вы должны изменить его на

Picasso.get().load(URL_BASE+"Forvo/Categories/Images/" + categoriesModel.getPhoto()).into(viewHolder.img_background);

Вы должны добавить Setter и Getter длявсе эти атрибуты.

Я рекомендую использовать JsonSchema2Pojo всякий раз, когда вы хотите проанализировать класс POJO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...