Android 如何创建二维网格类型视图以获取和设置每个单元格的字符串?
我想创建一个类似于图像的视图,其中每个单元格将由一个2D数组字符串填充。每个单元格将包含edittext,以便用户可以提供输入 我曾尝试使用GridLayout、GridView和TableView,但我无法在(I,j)位置获取任何特定单元格来获取和设置字符串。 我怎样才能做到这一点,任何想法、教程或代码片段都会很好Android 如何创建二维网格类型视图以获取和设置每个单元格的字符串?,android,user-interface,gridview,tableview,Android,User Interface,Gridview,Tableview,我想创建一个类似于图像的视图,其中每个单元格将由一个2D数组字符串填充。每个单元格将包含edittext,以便用户可以提供输入 我曾尝试使用GridLayout、GridView和TableView,但我无法在(I,j)位置获取任何特定单元格来获取和设置字符串。 我怎样才能做到这一点,任何想法、教程或代码片段都会很好 您是否考虑过在GridView中创建GridView? 您将拥有一个包含所需列数和行数的GridView,网格中的每个视图将是另一个GridView,它将由多个EditText组成
您是否考虑过在GridView中创建GridView? 您将拥有一个包含所需列数和行数的GridView,网格中的每个视图将是另一个GridView,它将由多个EditText组成。你需要2个适配器,每个GridView一个 使用代码编辑: 请注意,这是一个试用版,请根据您的需要进行调整 主要活动布局:
<GridView
android:id="@+id/grid_view_parent"
android:layout_width="match_parent"
android:layout_height="match_parent">
</GridView>
项目\网格\父项:
<GridView
android:id="@+id/grid_view_child"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</GridView>
项目\网格\子项:
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:textColor="#FFFFFF" />
主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
stringList.add("d");
GridView gridView = (GridView) findViewById(R.id.grid_view_parent);
gridView.setNumColumns(3);
GridParentAdapter gridParentAdapter = new GridParentAdapter(this,
stringList);
gridView.setAdapter(gridParentAdapter);
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List stringList=新建ArrayList();
stringList.添加(“a”);
字符串列表。添加(“b”);
添加(“c”);
stringList.添加(“d”);
GridView GridView=(GridView)findViewById(R.id.grid\u view\u parent);
gridView.setNumColumns(3);
GridParentAdapter GridParentAdapter=新的GridParentAdapter(此,
字符串列表);
setAdapter(gridParentAdapter);
}
GridParentAdapter:
public class GridParentAdapter extends BaseAdapter{
private Context context;
private GridView gridViewChild;
private List<String> items = new ArrayList<>();
public GridParentAdapter(Activity context, List<String> items){
this.context = context;
this.items = items;
}
@Override
public int getCount() {
return 3;
}
@Override
public Object getItem(int i) {
return items.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup
parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_grid_parent, parent
gridViewChild = (GridView) convertView.findViewById
(R.id.grid_view_child);
final GridChildAdapter gridChildAdapter = new
GridChildAdapter(context, items, this);
gridViewChild.setNumColumns(4);
gridViewChild.setAdapter(gridChildAdapter);
return convertView;
}
public void setItemChar(int position, String character){
items.set(position, character);
}
公共类GridParentAdapter扩展了BaseAdapter{
私人语境;
私有GridView gridViewChild;
私有列表项=新的ArrayList();
公共GridParentAdapter(活动上下文、列表项){
this.context=上下文;
这个项目=项目;
}
@凌驾
public int getCount(){
返回3;
}
@凌驾
公共对象getItem(int i){
返回项目。获取(i);
}
@凌驾
公共长getItemId(int i){
返回0;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组
父项){
LayoutInflater充气器=(LayoutInflater)context.getSystemService
(上下文、布局、充气机和服务);
convertView=充气机。充气(R.layout.item\u grid\u父级,父级
gridViewChild=(GridView)convertView.findViewById
(R.id.grid\u view\u child);
final GridChildAdapter GridChildAdapter=新建
GridChildAdapter(上下文、项、此);
gridViewChild.setNumColumns(4);
setAdapter(gridChildAdapter);
返回视图;
}
public void setItemChar(int位置,字符串字符){
项目集(位置、字符);
}
}
GridChildAdapter:
public class GridChildAdapter extends BaseAdapter {
private EditText editText;
private GridView gridViewParent;
private Context context;
private List<String> character;
private GridParentAdapter gridParentAdapter;
public GridChildAdapter(Context context, List<String> character
,GridParentAdapter gridParentAdapter){
this.context = context;
this.character = character;
this.gridParentAdapter = gridParentAdapter;
}
@Override
public int getCount() {
return character.size();
}
@Override
public Object getItem(int i) {
return character;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup
parent) {
LayoutInflater inflater =(LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_grid_child, parent,
false);
editText = (EditText) convertView.findViewById(R.id.edit_text);
editText.setText(character.get(position));
editText.setClickable(true);
editText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(MotionEvent.ACTION_UP == event.getAction()) {
InputMethodManager im = (InputMethodManager)
context.getSystemService
(Context.INPUT_METHOD_SERVICE);
im.showSoftInput(editText, 0);
editText.requestFocus();
}
return false;
}
});
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int
i,int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int
i1, int i2) {
if (editText.getText().toString() != "null") {
gridParentAdapter.setItemChar
(position,charSequence.toString());
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
return convertView;
}
public String getEditTextValue(EditText editText){
String string = "";
if(editText != null){
string = editText.getText().toString();
}
return string;
}
}
公共类GridChildAdapter扩展了BaseAdapter{
私人编辑文本;
私有GridView gridViewParent;
私人语境;
私有列表字符;
私有GridParentAdapter GridParentAdapter;
公共GridChildAdapter(上下文,列表字符
,GridParentAdapter(GridParentAdapter){
this.context=上下文;
这个。字符=字符;
this.gridParentAdapter=gridParentAdapter;
}
@凌驾
public int getCount(){
返回字符.size();
}
@凌驾
公共对象getItem(int i){
返回字符;
}
@凌驾
公共长getItemId(int i){
返回0;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组
父项){
LayoutInflater充气器=(LayoutInflater)context.getSystemService
(上下文、布局、充气机和服务);
convertView=充气机。充气(R.layout.item\u grid\u子项、父项、,
假);
editText=(editText)convertView.findViewById(R.id.edit_text);
editText.setText(character.get(position));
editText.setClickable(真);
editText.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
if(MotionEvent.ACTION\u UP==event.getAction()){
InputMethodManager im=(InputMethodManager)
context.getSystemService
(上下文、输入方法和服务);
im.showSoftInput(编辑文本,0);
editText.requestFocus();
}
返回false;
}
});
editText.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前的公共无效(CharSequence CharSequence,int
i、 inti1,inti2){
}
@凌驾
public void onTextChanged(CharSequence CharSequence,int i,int
i1,int i2){
if(editText.getText().toString()!=“null”){
gridParentAdapter.setItemChar
(position,charSequence.toString());
}
}
@凌驾
public void PostTextChanged(可编辑){
}
});
返回视图;
}
公共字符串getEditTextValue(EditText EditText){
字符串=”;
如果(editText!=null){
string=editText.getText().toString();
}
返回字符串;
}
}
通过扩展TextView以显示2D数组来创建自定义视图?请给我举个例子好吗?我有点喜欢你的答案,但如果你扩展答案或显示一些例子会很棒,因为到目前为止还不清楚。请查看编辑过的版本。别忘了这只是一个示例(您需要在要更改的编辑文本上单击两次)。我只是想把GridView理念的代码带到GridView中。谢谢你的帮助。虽然这不是我想要的,但我将它标记为正确答案,因为它显示了一种实现网格的方法。可能我将使用RecyclerView和StaggedLayoutManager,就像你在GridView中描述的那样。我想看看你的代码是什么n它会准备好的,听起来很有趣!因此,无论何时您需要,都可以通过电子邮件将代码发送给我。感谢您将代码标记为正确!