首页 > 解决方案 > 新文本字段未显示在 ToDoList 类型的应用程序中

问题描述

所以我是应用程序开发的新手,正在开发一种可以平衡化学方程式的 todolist 类型的应用程序。单击浮动(+)按钮时,应弹出一个左侧带有复选框的新文本字段,并且可以输入和保存数据。所以,它涉及到一个适配器类、模型类、数据库处理程序类、AddNewTask 类,所有这些都是我要添加的。问题是在单击按钮时,带有保存按钮的文本字段会随键盘出现以输入文本,但在单击保存按钮时它不会“保存”它。

适配器类:

public class EqBalAdapter extends RecyclerView.Adapter<EqBalAdapter.ViewHolder> {
    private List<EqBalModel> EqBalList;
    private MainActivity activity;
    private DatabaseHandler db;
    public List<String> finalPrintval = new ArrayList<String>();


    public EqBalAdapter(DatabaseHandler db, MainActivity activity){
        this.db=db;
        this.activity=activity;
    }

    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        View itemView= LayoutInflater.from(parent.getContext())
                .inflate(R.layout.task_layout, parent, false);
        return new ViewHolder(itemView);
    }
    public void onBindViewHolder(ViewHolder holder, int position){
        db.openDatabase();
        EqBalModel item=EqBalList.get(position);
        holder.task.setText(item.getTask());
        holder.task.setChecked(toBoolean(item.getStatus()));
        holder.task.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    db.updateStatus(item.getId(),1);
                    finalPrintval.add(item.getTask());
                }else{
                    db.updateStatus(item.getId(),0);
                }
            }
        });
    }
    public int getItemCount(){
        return EqBalList.size();
    }
    private boolean toBoolean(int n){
        return n!=0;
    }

    public void setTasks(List<EqBalModel> EqBalList){
        this.EqBalList=EqBalList;
        notifyDataSetChanged();
    }
    public Context getContext(){
        return activity;
    }
    public void deleteItem(int position){
        EqBalModel item=EqBalList.get(position);
        db.deleteTask((item.getId()));
        EqBalList.remove(position);
        notifyItemRemoved(position);
    }
    public void editItem(int position){
        EqBalModel item=EqBalList.get(position);
        Bundle bundle = new Bundle();
        bundle.putInt("id", item.getId());
        bundle.putString("task", item.getTask());
        AddNewTask fragment = new AddNewTask();
        fragment.setArguments(bundle);
        fragment.show(activity.getSupportFragmentManager(), AddNewTask.TAG);
    }
    public static class ViewHolder extends RecyclerView.ViewHolder{
        CheckBox task;
        ViewHolder(View view){
            super(view);
            task=view.findViewById(R.id.checkbox);
        }
    }

}

型号类:

public class EqBalModel {
    private int id, status;
    private String task;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getTask() {
        return task;
    }

    public void setTask(String task) {
        this.task = task;
    }
}

数据库处理程序类:

public class DatabaseHandler extends SQLiteOpenHelper {
    private static final int VERSION=1;
    private static final String NAME="EqualDatabase";
    private static final String TODO_TABLE = "todo";
    private static final String ID="id";
    private static final String TASK="task";
    private static final String STATUS="status";
    private static final String CREATE_TODO_TABLE = "CREATE TABLE " + TODO_TABLE + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                        + TASK + "TEXT, " + STATUS + " INTEGER)";
    private SQLiteDatabase db;
    public DatabaseHandler(Context context){
        super(context, NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL(CREATE_TODO_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        //DROP EXISTING TABLES
        db.execSQL("DROP TABLE IF EXISTS " + TODO_TABLE);
        //CREATE TABLES AGAIN
        onCreate(db);
    }

    public void openDatabase(){
        db=this.getWritableDatabase();
    }

    public void insertTask(EqBalModel task){
        ContentValues cv = new ContentValues();
        cv.put(TASK, task.getTask());
        cv.put(STATUS, 0);
        db.insert(TODO_TABLE, null, cv);
    }

    public List<EqBalModel> getAllTasks(){
        List<EqBalModel> taskList = new ArrayList<>();
        Cursor cur=null;
        db.beginTransaction();
        try{
            cur = db.query(TODO_TABLE, null, null, null, null, null, null, null);
            if(cur!= null){
                if(cur.moveToFirst()){
                    do{
                        EqBalModel task = new EqBalModel();
                        task.setId(cur.getInt(cur.getColumnIndex(ID)));
                        task.setTask(cur.getString(cur.getColumnIndex(TASK)));
                        task.setStatus(cur.getInt(cur.getColumnIndex(STATUS)));
                        taskList.add(task);

                    }while (cur.moveToNext());
                }
            }
        }finally {
            db.endTransaction();
            cur.close();
        }
        return taskList;
   }
   public void updateStatus(int id, int status){
        ContentValues cv = new ContentValues();
        cv.put(STATUS, status);
        db.update(TODO_TABLE, cv, ID + "=?", new String[] {String.valueOf(id)});
   }
   public void updateTask(int id, String task){
        ContentValues cv=new ContentValues();
        cv.put(TASK, task);
        db.update(TODO_TABLE, cv, ID + "=?", new String[] {String.valueOf(id)});
   }
   public void deleteTask(int id){
        db.delete(TODO_TABLE, ID + "=?", new String[] {String.valueOf(id)});
   }
}

AddNewTask 类:

import android.app.Activity;

import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;

import androidx.core.content.ContextCompat;

import com.example.chemicalequationbalancer.Adapter.EqBalAdapter;
import com.example.chemicalequationbalancer.Model.EqBalModel;
import com.example.chemicalequationbalancer.Utils.DatabaseHandler;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.google.android.material.snackbar.Snackbar;

import java.util.zip.Inflater;

public class AddNewTask extends BottomSheetDialogFragment{

    public static final String TAG = "ActionBottomDialog";
    private EditText newTaskTest;
    private Button newTaskSaveButton;
    private DatabaseHandler db;
    EqAlgo obj = new EqAlgo();

    public static AddNewTask newInstance(){
        return new AddNewTask();
    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NORMAL, R.style.DialogStyle);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View view= inflater.inflate(R.layout.new_task, container, false);
        getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        return view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState){
        super.onViewCreated(view, savedInstanceState);
        newTaskTest=getView().findViewById(R.id.newTaskText);
        newTaskSaveButton=getView().findViewById(R.id.newTaskButton);

        db=new DatabaseHandler(getActivity());
        db.openDatabase();

        boolean isUpdate = false;
        final Bundle bundle = getArguments();
        if(bundle != null){
            isUpdate=true;
            String task=bundle.getString("task");
            newTaskTest.setText(task);
            if(task.length()>0)
                newTaskSaveButton.setTextColor(ContextCompat.getColor(getContext(),R.color.teal));
        }
        newTaskTest.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(s.toString().equals(" ") || s.toString().equals("ERROR")){
                    newTaskSaveButton.setEnabled(false);
                    newTaskSaveButton.setTextColor(Color.GRAY);
                    newTaskSaveButton.setBackgroundColor(Color.RED);
                    s.toString().equals("REFER TO HELP GUIDE");
                }else{
                    newTaskSaveButton.setEnabled(true);
                    newTaskSaveButton.setTextColor(ContextCompat.getColor(getContext(),R.color.teal));
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
                if(s.toString().startsWith("Eq")){
                    String maineqtobeChck = (String) s.subSequence(2,s.length());
                    s.append(obj.equationBalance(maineqtobeChck));
                }
            }
        });
        boolean finalIsUpdate = isUpdate;
        newTaskSaveButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                String text = newTaskTest.getText().toString();
                Snackbar mySnackbar = Snackbar.make(v, text, 5000);

                if(finalIsUpdate){
                    db.updateTask(bundle.getInt("id"), text);
                    mySnackbar.show();

                }else{
                    EqBalModel task = new EqBalModel();
                    task.setTask(text);
                    task.setStatus(0);
                }
                dismiss();
            }
        });
    }
    @Override
    public void onDismiss(DialogInterface dialog){
        Activity activity=getActivity();
        if(activity instanceof DialogCloseListener){
            ((DialogCloseListener)activity).handleDialogClose(dialog);
        }
    }
}

MainActivity 浮动按钮代码:

 db = new DatabaseHandler(this);
        db.openDatabase();

        taskList = new ArrayList<>();

        taskRecyclerView = findViewById(R.id.reacRecyclerView);
        taskRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        tasksAdapter = new EqBalAdapter(db, this);
        taskRecyclerView.setAdapter(tasksAdapter);

        fab = findViewById(R.id.fab);

        ItemTouchHelper itemTouchHelper = new
                ItemTouchHelper(new RecyclerItemTouchHelper(tasksAdapter));
        itemTouchHelper.attachToRecyclerView(taskRecyclerView);

        taskList = db.getAllTasks();
        Collections.reverse(taskList);
        tasksAdapter.setTasks(taskList);

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AddNewTask.newInstance().show(getSupportFragmentManager(), AddNewTask.TAG);
            }

输入必须以两种方式进行:从方程式或普通文本的 Eq 开始。使用 Eq 键入时,应用程序关闭并出现以下 logcat 错误:

2021-03-05 17:02:45.128 31607-31607/com.example.chemicalequationbalancer E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.chemicalequationbalancer, PID: 31607
    java.lang.ClassCastException: android.text.SpannableStringBuilder cannot be cast to java.lang.String
        at com.example.chemicalequationbalancer.AddNewTask$1.afterTextChanged(AddNewTask.java:92)
        at android.widget.TextView.sendAfterTextChanged(TextView.java:9903)
        at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:12741)
        at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1273)
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:576)
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:506)
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:36)
        at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:863)
        at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:636)
        at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:401)
        at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:226)
        at android.app.ActivityThread.main(ActivityThread.java:7191)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:499)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)
2021-03-05 17:02:45.246 1196-3325/? E/Process: get_ion_cache_memory: Unable to open /d/ion/heaps/system
2021-03-05 17:02:45.267 1196-1322/? E/InputDispatcher: channel '6510a0d com.example.chemicalequationbalancer/com.example.chemicalequationbalancer.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2021-03-05 17:02:45.268 1196-1322/? E/InputDispatcher: channel 'e291db4 com.example.chemicalequationbalancer/com.example.chemicalequationbalancer.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2021-03-05 17:02:45.302 31963-31963/? E/.qualityprotec: Not starting debugger since process cannot load the jdwp agent.
2021-03-05 17:02:45.320 31963-31963/? E/libc: Access denied finding property "persist.vendor.sys.activitylog"
2021-03-05 17:02:45.363 20699-20724/? E/neodaemon: ERROR  elsaNotifyAppSwitch is NULL
2021-03-05 17:02:45.381 1196-4979/? E/OifaceUtil: Cannot connect to OifaceService

正常键入时,应用程序不会关闭,但保存后没有创建字段。logcat 说内存不足。

请询问更多需要的文件!如果你能提供帮助,真的很感激。谢谢!

标签: androidsqliteandroid-studioandroid-layout

解决方案


推荐阅读