Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何创建二维网格类型视图以获取和设置每个单元格的字符串?_Android_User Interface_Gridview_Tableview - Fatal编程技术网

Android 如何创建二维网格类型视图以获取和设置每个单元格的字符串?

Android 如何创建二维网格类型视图以获取和设置每个单元格的字符串?,android,user-interface,gridview,tableview,Android,User Interface,Gridview,Tableview,我想创建一个类似于图像的视图,其中每个单元格将由一个2D数组字符串填充。每个单元格将包含edittext,以便用户可以提供输入 我曾尝试使用GridLayout、GridView和TableView,但我无法在(I,j)位置获取任何特定单元格来获取和设置字符串。 我怎样才能做到这一点,任何想法、教程或代码片段都会很好 您是否考虑过在GridView中创建GridView? 您将拥有一个包含所需列数和行数的GridView,网格中的每个视图将是另一个GridView,它将由多个EditText组成

我想创建一个类似于图像的视图,其中每个单元格将由一个2D数组字符串填充。每个单元格将包含edittext,以便用户可以提供输入

我曾尝试使用GridLayout、GridView和TableView,但我无法在(I,j)位置获取任何特定单元格来获取和设置字符串。 我怎样才能做到这一点,任何想法、教程或代码片段都会很好


您是否考虑过在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它会准备好的,听起来很有趣!因此,无论何时您需要,都可以通过电子邮件将代码发送给我。感谢您将代码标记为正确!