如何在 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_TYPE
和 GENDER_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;
希望这能让您了解如何添加新的细胞类型
我正在使用这个 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_TYPE
和 GENDER_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;
希望这能让您了解如何添加新的细胞类型