Android - получение строки из определенного элемента вида сетки - PullRequest
2 голосов
/ 30 декабря 2011

Я довольно новичок в Android и играю с GridView. Я застрял, пытаясь извлечь строки из отдельных элементов GridView, чтобы сохранить состояние на основе изменений, внесенных пользователем.

Я набросал урезанную версию того, что я пытаюсь сделать для этого вопроса:

Представление каждого элемента в сетке состоит из TextView и EditText, определенных следующим XML-файлом; 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, состоящий из кнопки и вида сетки:

    <?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;
        }


    }

Итак, мой вопрос, как мне получить значение из сетки в виде нажатия кнопки. Произнесите значение «Бэтмен» в EditText в позиции 1 вида сетки. Я чувствую, что мне здесь чего-то не хватает!

1 Ответ

2 голосов
/ 30 декабря 2011
gridview.getAdapter().getItem(1).getNickname();

Это то, что вы ищете? при условии, что у вашего объекта Person есть метод get для псевдонима, конечно. - Извините, очевидно, я мог видеть это в вашем пользовательском адаптере.

Если ваша идея заключается в том, что пользователь может изменитьпсевдоним в EditText, вы, вероятно, захотите добавить TextChangedListener (TextWatcher) к каждому из них и после редактирования обновить псевдоним объекта Person, связанного с этой позицией в сетке;например, с помощью метода setNickname(String).

Самый простой способ думать об этом, вероятно, с точки зрения «моделей» и «представлений».TextViews и EditTexts являются представлениями, тогда как объекты Person в адаптере являются моделями.Если вы хотите внести какие-либо изменения в данные, измените базовые модели с некоторой логикой и просто обновите / обновите представления после этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...