当前位置: 首页 > 知识库问答 >
问题:

在Android中使用Retrofit时为什么不显示来自服务器的帖子

羊舌庆
2023-03-14

我想使用改装从服务器加载数据,并使用数据模型设置和获取数据。

这就是我想做的。当我单击一个类别时,我想在其他活动中看到该类别中的帖子。

为了显示分类帖子,我使用以下链接:http://tellfa.com/tafrihgah/?json=get_category_posts

对于过滤,我使用类别id

例如:http://tellfa.com/tafrihgah/?json=get_category_posts

设置链接的我的改装界面:(我在其他类中设置了base\u url)

public interface Retrofit_ApiInterface {

    // For Categories Response
    @GET("tafrihgah/?json=get_category_posts&")
    Call<R_CatModelResponse> getCatResponse(@Query("id") Integer id);
}

我通过以下代码将类别id发送给其他活动:

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

        private List<Retrofit_ColoniesModel> mDateSet;
        private Context mContext;
        private SparseBooleanArray expandState = new SparseBooleanArray();

        public ColoniesAdapter(Context context, List<Retrofit_ColoniesModel> dataSet) {
            this.mContext = context;
            this.mDateSet = dataSet;
            for (int i = 0; i < mDateSet.size(); i++) {
                expandState.append(i, false);
            }
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            View view = LayoutInflater.from(mContext).inflate(R.layout.colonies_row, parent, false);
            return new ViewHolder(view);
        }

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

            holder.colonies_title.setText(mDateSet.get(position).getTitle());
            holder.colonies_title.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = holder.getPosition();
                    Retrofit_ColoniesModel model = mDateSet.get(pos);
                    mContext.startActivity(new Intent(v.getContext(), Category_page.class)
                            .putExtra("categoryTitle", model.getTitle())
                            .putExtra("categoryID", model.getId()));

                    Toast.makeText(mContext, " " + model.getId(), Toast.LENGTH_SHORT).show();
                }
            });

...

Category\u页面代码:

public class Category_page extends AppCompatActivity {

    private static final long RIPPLE_DURATION = 250;
    private Toolbar toolbar;
    private TextView toolbar_title;
    private ImageView toolbar_menuImage;
    private RelativeLayout root;
    private CategoryAdapter mAdapter;
    private RecyclerView cat_recyclerView;
    private LinearLayoutManager mLayoutManager;
    private RelativeLayout loadLayout;
    private String catTitle = "";
    private Integer catID;
    private Bundle bundle;
    private int pageCount = 1;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.category_page);
        //if (!EventBus.getDefault().isRegistered(this)) {
        //   EventBus.getDefault().register(this);
        //}

        // Hide StatusBar color
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

        // Initializing
        context = Category_page.this;
        toolbar = (Toolbar) findViewById(R.id.category_toolbar);
        cat_recyclerView = (RecyclerView) findViewById(R.id.category_recycler);
        toolbar_title = (TextView) toolbar.findViewById(R.id.toolbar_pages_title);
        mLayoutManager = new LinearLayoutManager(this);
        root = (RelativeLayout) findViewById(R.id.category_root);
        loadLayout = (RelativeLayout) findViewById(R.id.category_empty_layout);
        // Toolbar
        setSupportActionBar(toolbar);
        if (toolbar != null) {
            getSupportActionBar().setTitle("");
        }

        // Receive Data
        bundle = getIntent().getExtras();
        catID = bundle.getInt("categoryID");
        if (bundle != null) {
            catTitle = bundle.getString("categoryTitle");
        }
        if (catTitle != null) {
            toolbar_title.setText(catTitle);
        }

        // Load data
        //LoadData(catID);
        // Menu
        View guillotineMenu = LayoutInflater.from(this).inflate(R.layout.menu_layout, null);
        root.addView(guillotineMenu);
        toolbar_menuImage = (ImageView) toolbar.findViewById(R.id.toolbar_pages_logo);
        new GuillotineAnimation.GuillotineBuilder(guillotineMenu, guillotineMenu.findViewById(R.id.menu_layout_image), toolbar_menuImage)
                .setStartDelay(RIPPLE_DURATION)
                .setActionBarViewForAnimation(toolbar)
                .setClosedOnStart(true)
                .build();
        // RecyclerView
        cat_recyclerView.setLayoutManager(mLayoutManager);
        cat_recyclerView.setHasFixedSize(true);

        // Retrofit //////////
        Retrofit_ApiInterface apiInterface = Retrofit_ApiClient.getClient().create(Retrofit_ApiInterface.class);
        Call<R_CatModelResponse> call = apiInterface.getCatResponse(catID);

        call.enqueue(new Callback<R_CatModelResponse>() {
            @Override
            public void onResponse(Call<R_CatModelResponse> call, Response<R_CatModelResponse> response) {
                List<R_CatModel> models = response.body().getCat_posts();

                mAdapter = new CategoryAdapter(context, cat_recyclerView, models);
                cat_recyclerView.setAdapter(mAdapter);

                Toast.makeText(Category_page.this, "Response", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(Call<R_CatModelResponse> call, Throwable t) {

                Toast.makeText(Category_page.this, "Error", Toast.LENGTH_SHORT).show();

            }
        });

我从一个适配器发送category\u id和以下代码:

mContext.startActivity(new Intent(v.getContext(), Category_page.class)
        .putExtra("categoryTitle", model.getTitle())
        .putExtra("categoryID", model.getId()));

并使用以下代码接收此数据:

// Receive Data
bundle = getIntent().getExtras();
catID = bundle.getInt("categoryID");

但是错误html" target="_blank">消息(Toast)而不是类别帖子!

显示错误toast发件人:

@Override
public void onFailure(Call<R_CatModelResponse> call, Throwable t) {
    Toast.makeText(Category_page.this, "Error", Toast.LENGTH_SHORT).show();
}

更新:
这是我得到的错误:

E/CatResponseError: Error : com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 48 path $.category

更新#2:
添加了我的POJO类:

public class R_CatModelResponse {

    @SerializedName("status")
    public String Cat_status;
    @SerializedName("count")
    public int Cat_count;
    @SerializedName("pages")
    public int Cat_pages;
    @SerializedName("category")
    public List<Retrofit_ColoniesModel> category;
    @SerializedName("posts")
    public List<R_CatModel> Cat_posts;

    public String getCat_status() {
        return Cat_status;
    }

    public void setCat_status(String cat_status) {
        Cat_status = cat_status;
    }

    public int getCat_count() {
        return Cat_count;
    }

    public void setCat_count(int cat_count) {
        Cat_count = cat_count;
    }

    public int getCat_pages() {
        return Cat_pages;
    }

    public void setCat_pages(int cat_pages) {
        Cat_pages = cat_pages;
    }

    public List<Retrofit_ColoniesModel> getCategory() {
        return category;
    }

    public void setCategory(List<Retrofit_ColoniesModel> category) {
        this.category = category;
    }

    public List<R_CatModel> getCat_posts() {
        return Cat_posts;
    }

    public void setCat_posts(List<R_CatModel> cat_posts) {
        Cat_posts = cat_posts;
    }
}

我怎样才能解决这个问题?

请帮帮我。提前谢谢。

共有1个答案

秦浩漫
2023-03-14

看看这个让你的生活更轻松的模式:D,基于此,使用以下结构:

您的数据模型应为:

public class Model {

    String status;
    int count;
    int page;
    Category category;
    List<Post> posts;

    // implement rest of thing

    public class Category{

        int id;
        String slug;
        String title;
        String description;
        int parent;
        int post_count;
    }

    public class Post {
        int id;
        String type;
        String slug;
        //..rest of thing
    }

}

您的服务界面应该是:

public interface IService {

        @GET("/tafrihgah/?json=get_category_posts")
        Call<Model> getCategoryPost(
                @Query("id") String id

                //...other query if you need should added like below
               @Query("categorySlug") String categorySlug,
               @Query("tag") String tag,
        );
    }

您的服务助手包含以下方法:

public Call<CategoryModel> getAllCategory() {
    return service.getCateogryPost();
}

而您的错误导致您的POJO未安装到服务器型号。仔细检查您的模型,确保对象而不是列表/数组

在您的情况下,而不是列表

 类似资料:
  • 我一直在尝试打印和HTTP post使用Swift的一个移动应用程序,我可以用javascript和express登录它。js。但当使用Go创建的服务器时,它会给我: 下面你可以看到所有3种语言的代码: 斯威夫特: 在另一个文件的@obj func中调用: 戈朗代码: 可以阅读文章的Javascript服务器: 谢谢你抽出时间

  • 我在Jaspersoft Studio中创建了一个示例报告 并将创建的报表发布到服务器连接。但当我打开服务器并检查发布的同一项时,它显示为空报表。为什么会这样?

  • 问题内容: 我使用node.js进行了以下简单的http服务器设置: 如您所见,当有请求传入时,我将其登录到控制台。现在,当我浏览到控制台时,显示出有两个连接: 为什么是这样? 问题答案: 通常是的要求。即使您没有头文件,也可以请求它,因为如果未在标头中设置相关文件,则规范会定义默认文件路径。 查找有关请求的最佳方法是: 客户端,方法是打开开发人员工具并查看“ 网络” 标签。 服务器端,通过记录

  • 我不知道在Android中使用RxJava和从Android体系结构组件中使用LiveData的原因,如果以代码的形式解释两者之间的差异,并提供示例,将会非常有帮助。

  • 我正在使用Python和Selenium捕获网页的HTML源,这样我就可以解析它来找到一个特定的元素。然而,它的来源与我使用浏览器的“Inspect Element”视图时得到的不同。我要找的元素不在硒提供的源中。有没有办法使用硒,或者使用另一种工具或方法获得相同的源?

  • 问题内容: 我正在编写一个脚本,该脚本应该在一堆服务器周围运行,并从其中选择一堆数据,包括本地服务器。选择所需数据的SQL非常复杂,因此我正在编写临时视图,并使用OPENQUERY语句获取数据,因此最终我最终循环了如下语句: 但是,我听说在本地服务器上使用OPENQUERY是一种皱眉。有人能详细说明为什么吗? 问题答案: 尽管查询可能返回多个结果集,但OPENQUERY仅返回第一个结果集。 OPE