java.lang.ClassCastException: android.text.SpannableStringBuilder 无法转换为 com.ree.kms.DakaHinbanClass

java.lang.ClassCastException: android.text.SpannableStringBuilder cannot be cast to com.ree.kms.DakaHinbanClass

我想给listview添加EditText,但是做起来不太顺利。请指导。如果是List,是正常的,但是使用了DakaHinbanClass,如何编写使用Class

的代码

数据取自MySQL,目前可以正常显示内容。我想直接在listview里改生产数量,但是运行的时候第195行的位置总是报错

错误代码:

2022-03-31 15:58:14.780 13403-13403/com.ree.kms E/AndroidRuntime: FATAL EXCEPTION: main Process: com.ree.kms, PID: 13403 java.lang.ClassCastException: android.text.SpannableStringBuilder cannot be cast to com.ree.kms.DakaHinbanClass at com.ree.kms.DakaListAdapterClass$MyTextWatcher.afterTextChanged(DakaListAdapterClass.java:195) at android.widget.TextView.sendAfterTextChanged(TextView.java:8336) at android.widget.TextView.setText(TextView.java:4399) at android.widget.TextView.setText(TextView.java:4247) at android.widget.EditText.setText(EditText.java:90) at android.widget.TextView.setText(TextView.java:4222) at com.ree.kms.DakaListAdapterClass.getView(DakaListAdapterClass.java:101) at android.widget.AbsListView.obtainView(AbsListView.java:2474) at android.widget.ListView.makeAndAddView(ListView.java:1920) at android.widget.ListView.fillDown(ListView.java:717) at android.widget.ListView.fillFromTop(ListView.java:778) at android.widget.ListView.layoutChildren(ListView.java:1701) at android.widget.AbsListView.onLayout(AbsListView.java:2235) at android.view.View.layout(View.java:16953) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189) at android.view.View.layout(View.java:16953) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396) at android.widget.FrameLayout.onLayout(FrameLayout.java:333) at android.view.View.layout(View.java:16953) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844) at android.widget.LinearLayout.onLayout(LinearLayout.java:1753) at android.view.View.layout(View.java:16953) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396) at android.widget.FrameLayout.onLayout(FrameLayout.java:333) at android.view.View.layout(View.java:16953) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844) at android.widget.LinearLayout.onLayout(LinearLayout.java:1753) at android.view.View.layout(View.java:16953) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396) at android.widget.FrameLayout.onLayout(FrameLayout.java:333) at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2740) at android.view.View.layout(View.java:16953) at android.view.ViewGroup.layout(ViewGroup.java:5579) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2562) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2265) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1323) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6718) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:894) at android.view.Choreographer.doCallbacks(Choreographer.java:696) at android.view.Choreographer.doFrame(Choreographer.java:631) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:880) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5765) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

DakaListAdapterClass

package com.ree.kms;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.TextView;

import java.util.List;

public class DakaListAdapterClass extends BaseAdapter {

    String contains1,contains2;
    Context context;
    List<DakaHinbanClass> valueList;
    private int mTouchItemPosition=-1;

    public DakaListAdapterClass(List<DakaHinbanClass> listValue,Context context){
        this.context = context;
        this.valueList = listValue;
    }

    @Override
    public int getCount() {
        return this.valueList.size();
    }

    @Override
    public Object getItem(int position) {
        return this.valueList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewItem_Daka viewItem_daka = null;
        if (convertView == null){
            viewItem_daka = new ViewItem_Daka();
            LayoutInflater layoutInflater = (LayoutInflater) this.context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.listview_daka,null);
            viewItem_daka.TextViewHinban = convertView.findViewById(R.id.tv_daka_hinban);
            viewItem_daka.TextViewQuery = convertView.findViewById(R.id.tv_daka_query);
            viewItem_daka.TextViewKyakusaki = convertView.findViewById(R.id.tv_daka_kyakusaki);
            viewItem_daka.TextViewDate_End = convertView.findViewById(R.id.tv_daka_date_end);
            viewItem_daka.TextViewRemarks = convertView.findViewById(R.id.tv_daka_remarks);
            viewItem_daka.TextViewCyui = convertView.findViewById(R.id.tv_daka_cyui);
            viewItem_daka.TextViewRakasu = convertView.findViewById(R.id.tv_daka_rakasu);
            viewItem_daka.EditTextQuery_out = convertView.findViewById(R.id.tv_daka_query_out);

            viewItem_daka.EditTextQuery_out.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    mTouchItemPosition = (int) v.getTag();

                    if ((v.getId()==R.id.tv_daka_query_out && canVertivalScroll((EditText) v) )){
                        v.getParent().requestDisallowInterceptTouchEvent(true);
                        if (event.getAction()== MotionEvent.ACTION_UP){
                            v.getParent().requestDisallowInterceptTouchEvent(false);
                        }
                    }
                    return false;
                }
            });

            viewItem_daka.mTextWatcher = new MyTextWatcher();
            viewItem_daka.EditTextQuery_out.addTextChangedListener(viewItem_daka.mTextWatcher);
            viewItem_daka.updatePosition(position);

            convertView.setTag(viewItem_daka);
        }else{
            viewItem_daka = (ViewItem_Daka) convertView.getTag();
            viewItem_daka.updatePosition(position);
        }

        viewItem_daka.TextViewHinban.setText("品番:"+valueList.get(position).Hinban);
        viewItem_daka.TextViewQuery.setText("着荷数:"+valueList.get(position).Query);
        viewItem_daka.TextViewKyakusaki.setText("取引先:"+valueList.get(position).Kyakusaki);
        viewItem_daka.TextViewDate_End.setText("完成予定:"+valueList.get(position).Date_end);
        viewItem_daka.TextViewRakasu.setText("落下数:"+valueList.get(position).Rakasu);

        viewItem_daka.EditTextQuery_out.setText(valueList.get(position).Query);
        viewItem_daka.TextViewRemarks.setText("備考:"+valueList.get(position).Remarks);
        viewItem_daka.TextViewStatus = valueList.get(position).Status;

        if (mTouchItemPosition==position){
            viewItem_daka.EditTextQuery_out.requestFocus();
            viewItem_daka.EditTextQuery_out.setSelection(viewItem_daka.EditTextQuery_out.getText().length());
        }else{
            viewItem_daka.EditTextQuery_out.clearFocus();
        }

        if (TextUtils.isEmpty(valueList.get(position).Cyui)){
            viewItem_daka.TextViewCyui.setText("注意:なし");
        }else {
            viewItem_daka.TextViewCyui.setText("注意:" + valueList.get(position).Cyui);
        }

        contains1= (String) viewItem_daka.TextViewCyui.getText();
        contains2= (String) viewItem_daka.TextViewStatus;
        if(contains1.equals("注意:なし")){
            viewItem_daka.TextViewCyui.setTextColor(Color.parseColor("#808080"));

        }else{
            viewItem_daka.TextViewCyui.setTextColor(Color.parseColor("#FF0000"));
        }

        if (!contains2.contains("生産済")){
            convertView.setBackgroundResource(R.drawable.listview_daka_background);
        }else{
            convertView.setBackgroundResource(R.drawable.listview_chaka_background);
        }
        return convertView;
    }

    private boolean canVertivalScroll(EditText editText){
        int scrollY = editText.getScrollY();
        int scrollRange = editText.getLayout().getHeight();
        int scrollExtent = editText.getHeight() - editText.getCompoundPaddingTop() - editText.getCompoundPaddingBottom();
        int scrollDifference = scrollRange - scrollExtent;
        if (scrollDifference == 0){
            return false;
        }
        return (scrollY>0) || (scrollY < scrollDifference -1 );
    }
    class ViewItem_Daka {
        TextView TextViewHinban;
        TextView TextViewQuery;
        TextView TextViewDate_End;
        TextView TextViewKyakusaki;
        TextView TextViewCyui;
        TextView TextViewRemarks;
        TextView TextViewFusoku;
        TextView TextViewRakasu;
        EditText EditTextQuery_out;
        TextView TextViewQuery_out;
        String TextViewStatus;
        MyTextWatcher mTextWatcher;
        public void updatePosition(int position){
            mTextWatcher.updatePosition(position);
        }
    }

    class MyTextWatcher implements TextWatcher{
        private int mPosition;
        public void updatePosition(int Position){
            mPosition = Position;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            valueList.set(mPosition, (DakaHinbanClass) s);    ←error is here
        }
    }
}

DakaHinbanClass

package com.ree.kms;

public class DakaHinbanClass {
    public String HinbanId;
    public String Hinban;
    public String HangaNumber;
    public String Date_end;
    public String Query;
    public String Weight;
    public String WeightAll;
    public String Cyui;
    public String Query_out;
    public String Remarks;
    public String Kyakusaki;
    public String Status;
    public String Fusoku,Rakasu,FuryoHakuri,FuryoHaiki;
}

@Override public void afterTextChanged(Editable s) { valueList.set(mPosition, s.toString()); ←That's not right }

用户修改EditText里面的字符串后,调用afterTextChanged(Editable s)方法,s代表新修改的String。你想更新列表中的 DakaHinbanClass 对象,所以你不能只将 String 转换为对象(这个 String 只是这个对象的一个​​ class 成员 class,对吧?)

如果要更新此对象内部的Query值,首先获取对象然后将class成员值设置为新的String,如下所示:

  @Override
    public void afterTextChanged(Editable s){

        DakaHinbanClass temp = valueList.get(mPosition);
        temp.Query = s.toString();
    }