如何在 android studio 的 tableview 上设置 edittext?

How to set edittext on tableview on android studio?

我正在使用这个 tableview 插件 https://github.com/evrencoskun/TableView

我想做的是将第二列设为输入编辑文本,任何帮助或建议都将非常有用,谢谢

不可能给出详细的答案,因为您没有给出您正在尝试做什么或如何使用 TableView 实现的代码。

答案基于 Java 中的示例应用程序,因为我无事可做,所以您必须转换为 kotlin。

第一部分如果创建一个新的布局来布置一个带有编辑文本的单元格,我在示例应用程序中复制了 table_view_cell_layout.xml 并将其命名为 table_view_edit_layout.xml 并更改了 TextView 小部件和 EditText 并设置更多选项。
完整文件如下:-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/cell_container"
              xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="wrap_content"
              android:layout_height="@dimen/cell_height"
              android:background="@color/cell_background_color"
              android:gravity="center"
              android:orientation="vertical">


    <EditText
        android:id="@+id/cell_data"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_vertical"
        android:layout_marginEnd="10dp"
        android:layout_marginStart="10dp"
        android:gravity="center"
        android:maxLines="1"
        android:textColor="@color/table_view_default_text_color"
        android:textSize="@dimen/text_size"
        android:visibility="visible"
        android:imeOptions="actionDone"
        android:importantForAutofill="no"
        tools:text="Cell Data"/>

</LinearLayout>

下一步是为此布局创建一个 ViewHolder,再次将 CellViewHolder.java 文件复制为 EditViewHolder.java 并进行一些调整(请参阅有关您可能应该做更多事情的评论)。
完整文件如下:-

package com.evrencoskun.tableviewsample.tableview.holder;

import android.content.Context;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.evrencoskun.tableview.adapter.recyclerview.holder.AbstractViewHolder;
import com.evrencoskun.tableviewsample.R;
import com.evrencoskun.tableviewsample.tableview.model.Cell;

import java.util.Locale;

public class EditViewHolder extends AbstractViewHolder {
    @NonNull
    private final EditText cell_edittext;
    @NonNull
    private final LinearLayout cell_container;

    private Cell cell;

    public EditViewHolder(@NonNull View itemView) {
        super(itemView);
        cell_edittext = itemView.findViewById(R.id.cell_data);
        cell_container = itemView.findViewById(R.id.cell_container);

        // Probably want to cover handling more ways of finishing editing than just Action Done / Enter
        cell_edittext.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                int result = actionId & EditorInfo.IME_MASK_ACTION;
                switch(result) {
                    case EditorInfo.IME_ACTION_DONE:
                    case EditorInfo.IME_NULL:
                        // Save the data to the model so it will be saved.
                        Toast.makeText(itemView.getContext(),"Cell " + cell.getId() + " new text= " + cell_edittext.getText().toString(),Toast.LENGTH_SHORT).show();
                        // Probably make it not have have focus and hide the keyboard
                        cell_edittext.clearFocus();
                        InputMethodManager imm = (InputMethodManager) itemView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(cell_edittext.getWindowToken(), 0);
                        break;
                    default:
                        return false;
                }
                return true;
            }
        });
    }

    public void setCell(@Nullable Cell cell) {
        // Store Cell for later reference
        this.cell = cell;
        cell_edittext.setText(String.valueOf(cell.getData()));

        // If your TableView should have auto resize for cells & columns.
        // Then you should consider the below lines. Otherwise, you can ignore them.

        // It is necessary to remeasure itself.
        cell_container.getLayoutParams().width = LinearLayout.LayoutParams.WRAP_CONTENT;
        cell_edittext.requestLayout();
    }
}

注意这不会处理将更改文本保存到您正在使用的任何数据模型,它只是在 Toast 中显示更改的文本,因此如果您将项目滚动到屏幕外。

最后一部分是调整 TableViewAdapter 文件以使用新的 EditViewHolder,就像示例应用程序中的适配器一样,您只需添加新的 switch 项目,就像 MOOD_CELL_TYPEGENDER_CELL_TYPE

在适配器顶部添加静态视图类型Class

private static final int EDIT_CELL_TYPE = 3;

例如在 onCreateCellViewHolder 添加大小写

            case EDIT_CELL_TYPE:
                // Get edittext cell layout which has EditText instead of TextView.
                layout = inflater.inflate(R.layout.table_view_edit_layout, parent, false);

                return new EditViewHolder(layout);

onBindCellViewHolder中添加大小写

case EDIT_CELL_TYPE:
                // Get the holder to update cell item text
                EditViewHolder editViewHolder = (EditViewHolder) holder;
                editViewHolder.setCell(cellItemModel);
                break;

getCellItemViewType 中通过添加大小写

将列 2 设置为 EDIT_CELL_TYPE
           case 2:
                return EDIT_CELL_TYPE;

希望这能让您了解如何添加新的细胞类型