簡體   English   中英

RecyclerView不顯示項目

[英]RecyclerView not show Items

我有一個問題,為什么RecyclerView不顯示項目我不知道為什么不顯示項目。

json網址

[
  {
    "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;
    }
}

接口

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>

從昨天開始,我一直試圖找出問題所在,但沒有找到問題,、、、、、、、、、、、、、、、、、、、、、、、、、、 ,,,,,,,,,,,,,,,,,,,,

您可以避免此代碼

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);

您必須為所有這些屬性添加SetterGetter

我建議您在要解析POJO類時都使用JsonSchema2Pojo

確保預定義圖像視圖的大小。 因為除非您聲明其他內容,否則加載的圖像將根據其大小進行調整。

<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>

並從Google或其他網站中選擇另一個圖片網址,該網址只會在您轉到鏈接時顯示圖片,以確保您的網址參數錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM