2

我对 Android 很陌生,我一直在玩 GridView。我一直在尝试从 GridView 的各个元素中检索字符串,以便我可以根据用户所做的更改来保存状态。

我已经模拟了我试图为这个问题做的一个精简版本:

网格中每个元素的视图由以下 xml 文件定义的 TextView 和 EditText 组成;grid_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"            
    android:id = "@+id/single_item_id"          
    android:layout_width="fill_parent"             
    android:layout_height="fill_parent"             
    android:orientation="vertical"
>  
    <TextView
      android:id = "@+id/label"
      android:layout_width = "fill_parent"             
      android:layout_height="wrap_content"
      android:inputType="text">
    </TextView>
    <EditText
      android:id = "@+id/item_value"
      android:layout_width = "fill_parent"             
      android:layout_height="wrap_content"
      android:inputType="text">
    </EditText>     
 </LinearLayout> 

我的 main.xml,由一个按钮和一个 gridview 组成:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <Button
            android:id="@+id/editbutton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onRetrieveButtonClick"
            android:text="@string/get" android:clickable="true"/>

        <GridView
            android:id="@+id/gridview"
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"
            android:numColumns="auto_fit"
            android:verticalSpacing="10dp"
            android:horizontalSpacing="10dp"
            android:columnWidth="250dp"
            android:stretchMode="columnWidth"
            android:gravity="center"
            android:paddingTop="50dp">
        </GridView>

    </LinearLayout>

我的活动课:

    package com.jdev.simplegrid;

    import java.util.ArrayList;

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.GridView;
    import android.widget.Toast;

    public class SimpleGridActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            GridView gridview = (GridView) findViewById(R.id.gridview);

            //Some hard-coded sample data -each person has a birth-name and a nickname
            ArrayList<Person> people = new ArrayList<Person>();
            people.add(new Person("David","Dave"));
            people.add(new Person("Bruce","Batman"));
            people.add(new Person("John","J"));

            gridview.setAdapter(new SimpleAdapter(this, people));
        }

        public void onRetrieveButtonClick(View view)  
        {  
            Toast.makeText(getBaseContext(), "Get the String value of EditText at position 1 of the gridview e.g Batman", Toast.LENGTH_LONG).show();
            //Get the String value of EditText at position 1 of the gridview. e.g Batman 
        }
    }

最后是我的视图适配器:

    package com.jdev.simplegrid;

    import java.util.ArrayList;

    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.EditText;
    import android.widget.TextView;

    public class SimpleAdapter extends BaseAdapter {
        private Context mContext;
        private ArrayList<Person> personList;

        public SimpleAdapter(Context c, ArrayList<Person> people) {
            mContext = c;
            personList = people;
        }

        public int getCount() {
            return personList.size();
        }

        public Person getItem(int position) {
            return personList.get(position);
        }

        public long getItemId(int position) {
            return 0;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view=inflater.inflate(R.layout.grid_item, parent, false);

            TextView birthnameLabel=(TextView)view.findViewById(R.id.birthname);
            birthnameLabel.setText(personList.get(position).getBirthname());

            EditText nicknameText=(EditText)view.findViewById(R.id.nickname);
            nicknameText.setText(personList.get(position).getNickname());

            return view;
        }


    }

所以我的问题是,如何通过单击按钮从gridview 中检索a 值。在网格视图的位置 1 处的 EditText 中说出值“蝙蝠侠”。我觉得我真的在这里错过了一些东西!

4

1 回答 1

2
gridview.getAdapter().getItem(1).getNickname();

那是你要找的吗?假设您的 Person 对象当然有一个用于昵称的 getter 方法。- 抱歉,显然我可以在您的自定义适配器中看到这一点。

如果您的想法是用户可以在 EditText 中更改昵称,您可能希望为TextWatcher每个人添加一个 TextChangedListener (),并在编辑后更新与网格中该位置关联的 Person 对象的昵称;例如,借助一种setNickname(String)方法。

考虑这一点的最简单方法可能是“模型”和“视图”。TextViews 和 EditTexts 是视图,而适配器中的 Person 对象是模型。如果您想对数据进行任何更改,请使用一些逻辑修改底层模型,然后简单地让视图更新/刷新。

于 2011-12-30T01:28:23.010 回答