草庐IT

安卓改造 : Display in Recyclerview

coder 2023-12-29 原文

我对如何将我的 json 数据显示到回收站 View 有疑问。这是我想在回收站 View 中显示“错误”的 JSON 数据。我尝试了一些方法,但它总是强制关闭。

{
 "result": true,
 "errors": [
   {
    "id": "e1812696024",
    "offset": 2,
    "length": 2,
    "bad": "is",
    "better": [
      "am"
        ],
    "type": "grammar"
   },
   {
    "id": "e962925648",
    "offset": 8,
    "length": 8,
    "bad": "engeneer",
    "better": [
       "engineer",
       "engender"
        ],
    "type": "spelling"
    }
 ]
}

这是我的代码: 服务类(接口(interface))

public interface Service {

      @POST("/check.php")
      Call<InputResult> readErrors(@Query("userInput") String userInput,
                                   @Query("apiKey") String apiKey);
 }

模型类: 输入结果.java

public class InputResult {

    @SerializedName("result")
    private String result;

    @SerializedName("errors")
    private List<Errors> errors;

   //getter and setter
}

错误.java

public class Errors {

   @SerializedName("id")
   private String id;

   @SerializedName("offset")
   private int offset;

   @SerializedName("length")
   private int length;

   @SerializedName("bad")
   private String bad;

   //getter and setter
}

适配器

public class ResultAdapter extends RecyclerView.Adapter<ResultAdapter.ResultViewHolder>{

Context mContext;
List<Photo> photoList = new ArrayList<>();
List<Errors> errorsList = new ArrayList<>();

public ResultAdapter (Context mContext, List<Errors> errorsList){
    this.errorsList = errorsList;
    this.mContext = mContext;
}

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

@Override
public void onBindViewHolder(ResultViewHolder resultViewHolder, int i) {

    Errors errors = errorsList.get(i);
    resultViewHolder.mNumErrorsTextView.setText(errorsList.size());
    resultViewHolder.mIdErrorTextView.setText(errors.getId());
    resultViewHolder.mLengthErrorTextView.setText(errors.getLength());
    resultViewHolder.mBadErrorTextView.setText(errors.getBad());
}

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

 //Viewholder
 ...
 }

fragment 类:

ublic class Tab1Fragment_GrammarChecker extends Fragment {

private static final String TAG = "Tab1Fragment";
private PhotoAdapter adapter;

@BindView(R.id.InputTextEditText)
EditText mInputGrammarEditText;

@BindView(R.id.ErrorsRecyclerView)
RecyclerView mErrorsRecyclerView;

List<Errors> errors = new ArrayList<>();
public ArrayList<Errors> errorArrayList = new ArrayList<>();

List<InputResult> inputResults = new ArrayList<>();
public ArrayList<InputResult> inputResultArrayList = new ArrayList<>();

public static String userInput = "I is an engeneer!";
public String apiKey = ""; 

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.tab1_grammar_checker, container, false);
    ButterKnife.bind(this, view);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    mErrorsRecyclerView.setLayoutManager(layoutManager);
    loadJson();

    return view;
}

public void loadJson(){

    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl("https://api.textgears.com")
            .addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = builder.build();

    Service serviceAPI = retrofit.create(Service.class);
    Call<InputResult> loadErrorsCall = serviceAPI.readErrors(userInput, apiKey);
    loadErrorsCall.enqueue(new Callback<InputResult>() {
        @Override
        public void onResponse(Call<InputResult> call, Response<InputResult> response) {
            if (response.isSuccessful()){
                inputResults = response.body();
                Log.i("ORIG. ARRAY SIZE", String.valueOf(inputResultArrayList.size()));
                if (inputResultArrayList != null){
                    for (int i = 0; i < 5; i++){
                        inputResultArrayList.add(inputResults.get(i));
                    }

                    Log.i("NEW ARRAY SIZE", String.valueOf(errorArrayList.size()));
                }
                mErrorsRecyclerView.setItemAnimator(new DefaultItemAnimator());
                mErrorsRecyclerView.setAdapter(new ResultAdapter1(getContext(), inputResultArrayList));
                Log.e("Fragment", response.body().toString());
                Log.e("Fragment", "SUCCESS");
            }
            else {
                Log.i("ERROR", "");
            }

        }

        @Override
        public void onFailure(Call<InputResult> call, Throwable t) {
            Log.i("Error: ", t.getMessage());
        }
    });
}

}

日志:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: renelyn.austria.grammatika, PID: 32547
java.lang.ClassCastException: renelyn.austria.grammatika.Model.InputResult cannot be cast to java.util.List
    at renelyn.austria.grammatika.Tab1Fragment_GrammarChecker$1.onResponse(Tab1Fragment_GrammarChecker.java:95)
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:71)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:145)
    at android.app.ActivityThread.main(ActivityThread.java:5832)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

最佳答案

模型可能应该看起来像 JSON输入...

带有 ArrayList<Error> errors而不是 List :

public class Results {

    @SerializedName("result")
    private Boolean success;

    @SerializedName("errors")
    private ArrayList<Error> errors;
    ...
}

和另一个(此处 List 可用于映射 String 项):

public class Error {

    @SerializedName("id")
    private String id;

    @SerializedName("offset")
    private Long offset;

    @SerializedName("length")
    private Long length;

    @SerializedName("bad")
    private String bad;

    @SerializedName("better")
    private List<String> better;

    @SerializedName("type")
    private String type;
    ...
}

然后它应该可以工作,没有任何无意义的困惑:

Results results = response.body();
if(results.getSuccess())
    ArrayList<Error> errors = results.getErrors();
}

关于安卓改造 : Display in Recyclerview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53976480/

有关安卓改造 : Display in Recyclerview的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. (一)专题介绍:移动端安卓手机改造成linux服务器&linux服务器中安装软件、部署前后端分离项目实战 - 2

    快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目

  3. 微信小程序安卓视频播放卡顿问题 - 2

    在微信小程序开发中遇到在video组件的两个问题1.安卓手机里播放视频会有明显的卡顿问题刚开始以为是网络问题,或者是视频文件问题。排查了一下发现都没问题最后加了个属性就OK了uniapp和原生小程序方法:custom-cache="false"custom-cache={{false}}video组件兼容iOS手机custom-cache加了这个属性会让2.iOS手机第一次播放视频会有几秒黑屏问题因此我加了当前手机型号的判断uni.getDeviceInfo().deviceType获取当前设备api当为iPhone时不加custom-cache属性,否则加上custom-cache=“fal

  4. javascript - JS如何改造这个不规则对象 - 2

    我有这个对象,它的键保证排序并将用于操作。它的每个值都是一个二维数组。varobj={"0":[[0,1],[0,3],[0,4]],"1":[[1,2],[1,3]],"2":[[2,3],[2,5]],"3":[[3,4],[3,6]],"5":[[5,6]],"6":[[6,5]]}我正在尝试连接它们,并且对于它的每个数组的最后一个值都是对象的下一个索引。所以,我的预期结果是这样的数组,模式是,我必须找到一种方法,从0(obj的第一个索引)到最后一个索引(6)>通过使用其中每个值并将其最后一个数组值链接到下一个对象。如果这是有道理的话。[0,1,2,3,4,5,6][0,1,2,

  5. 安卓渐变的背景框实现 - 2

    安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合,这是最推荐的方法,也是最有效的。2.利用canvas裁剪实现,这个方法有个缺陷,就是圆角会出现毛边,也就是锯齿。3.利用layer绘制边框1.背景万恶的设计小姐姐又来搞事情啦,你说好好的设计一个纯色的背景框框不好嘛,非要把一个框框弄成渐变的,如果不拿出放大镜估计没几个人能看出来它是渐变的。来,我让你看看是啥样框子是从左到右渐变的,设计应该是做了一个底图,然后上面盖了一个白色圆角矩形。那么我们该怎么去实现它呢?实现方法下面介绍三种实现它的方法。先贴上源码地址,大家记得给个starhttps://git

  6. 安卓手机浏览器:远程调试 - 2

    简介:有时我们需要调试手机浏览器网页信息,这时除了使用fiddler抓包拦截篡改,还可以通过USB连接,通过PC远程调试手机上的浏览器信息,进行映射。历史攻略:adb:安卓手机USB调试模式前置准备:网页内容在移动设备上的体验可能和电脑上完全不同。ChromeDevTools提供远程调试功能安卓远程调试支持:在浏览器选项卡中调试网站。在原生安卓应用中调试网页内容。将屏幕从你的安卓设备上投影到你的开发机器上。使用端口转发和虚拟主机映射来让安卓设备访问开发使用的服务器。操作步骤:1、手机通过USB连接电脑。2、开启手机调试模式。3、PC电脑edge输入:edge://inspect/#device

  7. 安卓性能优化之内存优化 - 2

    Java对象生命周期:创建:为对象分配内存空间,构造对象应用:此时对象至少被一个强引用持有不可见:未被任何强引用持有,进行可达性分析不可达:可达性分析为不可达,进入下一阶段收集:当垃圾回收器发现该对象已经处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了“收集阶段”。如果该对象已经重写了finalize()方法,则会去执行该方法的终端操作。终结:当对象执行完finalize()方法后仍然处于不可达状态时(可达性分析垃圾回收算法被回收前,会有两次标记过程,判断是否执行lfinalize()方法,执行完之后判断是否GCROOT可达,如果仍不可达,则准备回收),则

  8. Qt安卓开发:调用java代码的获取usb权限 - 2

    最近换了工作,新工作是负责用qml做qt安卓开发。工作中遇到一个问题:安卓设备有USB口,需要插入一个U盘在程序里读写U盘中的文件,由于安卓系统的安全性的问题导致QFile、c++的文件操作相关方法都不能读写成功,想要读写成功只能调用java代码,在java代码里面使用安卓的DocumentFile库。经过一番探索,成功解决了问题。qt如何添加java代码不说了,网上有。下面是具体的java代码:packagecom.example.myapplication;importandroid.annotation.TargetApi;importandroid.content.Context;im

  9. Obsidian安卓端同步及使用(Remotely Save+阿里云同步S3) - 2

    Obsidian安卓端同步及使用(RemotelySave+阿里云同步S3)强烈推荐的obsidian的markdown教程​obsidian这款软件很不错,最近刚入门,用来做笔记,喜欢在电脑上做笔记,手机端能随时查看,故捣鼓了一下安卓端的同步及安卓端的使用1.安装包获取​不能科学上网,我是到官方中文论坛上找到的,网址如下:移动端v1.4.1开始测试-Obsidian中文论坛2.电脑端同步+阿里云配置​我使用的是RemotelySave插件​首先,电脑端关闭安全模式,下载这个第三方插件,登不上的看这里,网址如下:完美解决obsidian无法加载第三方插件(社区插件)的问题​然后就是阿里云的同步

  10. 安卓 XML 错误 : no resource identifier found for attribute 'xmlns' in package 'android' - 2

    我知道这里有一百个问题和我一样,但似乎没有一个适合我的具体问题,所以我要问一个新问题。以防万一这是重复,我很抱歉。所以,我正在构建一个应用程序,布局给我带来了一些问题。这是我的XML代码:(尚未完成)我得到的错误是在代码的第一行它说“错误:在包'android'中找不到属性'xmlns'的资源标识符我一遍又一遍地检查代码,尝试刷新/重建项目,尝试删除该特定行等等,但似乎没有任何解决办法。那么,如果有人有一些想法?谢谢! 最佳答案 删除android:xmlns="http://schemas.android.com/apk/res/

随机推荐