Как получить объект из GridView itemClick

У меня есть действие с именем countryActivity и класс модели с именем Country. Я хочу установить значения в классе модели и сохранить каждый объект в массиве, а также показать значения объекта в виде сетки. Когда элементы будут нажаты, я хочу получить объекты. Ниже мои коды. Где я ошибся или что делать? помогите мне плз?

activity_country.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context=".CountryActivity" >


 <TextView
    android:id="@+id/nTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="21dp"
    android:layout_marginTop="26dp"
    android:text="Name" />

 <TextView
    android:id="@+id/aTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/nTextView"
    android:layout_below="@+id/nTextView"
    android:layout_marginTop="24dp"
    android:text="About" />

 <EditText
    android:id="@+id/CountryNameEditText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/nTextView"
    android:layout_alignBottom="@+id/nTextView"
    android:layout_marginLeft="48dp"
    android:layout_toRightOf="@+id/nTextView"
    android:ems="10" >

    <requestFocus />
 </EditText>

 <EditText
    android:id="@+id/CountryAboutEditText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/CountryNameEditText"
    android:layout_alignTop="@+id/aTextView"
    android:ems="10" />

<Button
    android:id="@+id/saveCountryButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/CountryAboutEditText"
    android:layout_below="@+id/CountryAboutEditText"
    android:layout_marginLeft="16dp"
    android:layout_marginTop="22dp"
    android:text="Save" 
    android:onClick="saveCountry"
    />

<GridView
    android:id="@+id/countryGridView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/saveCountryButton"
    android:layout_centerHorizontal="true"
    android:numColumns="2">
</GridView>
</RelativeLayout>

CountryActivity.java

 public class CountryActivity extends Activity 
{
ArrayList<Country> countries = new ArrayList<Country>();
Country aCountry;

EditText CountryNameTxtBox;
EditText CountryAboutTxtBox;
GridView countrygGridView;

@Override
protected void onCreate(Bundle savedInstanceState) 
    {
     super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_country);
    // Show the Up button in the action bar.

    CountryNameTxtBox = (EditText)findViewById(R.id.CountryNameEditText);
    CountryAboutTxtBox = (EditText)findViewById(R.id.CountryAboutEditText);
    countrygGridView = (GridView)findViewById(R.id.countryGridView);

}
if((txtName!="" || txtName!=null) &&  (txtAbout!="" || txtAbout != null))
    {
      aCountry = new Country(txtName, txtAbout);
      countries.add(aCountry);
    }

    showGrid();

}


public void showGrid()
{
     ArrayList<Country> list2 = new ArrayList<Country>();

    for(Country arrCountry : countries)
    { 
             list2.add(aCountry);

    } 


      ArrayAdapter<Country> adapter2 = new ArrayAdapter<Country>(this,android.R.layout.simple_list_item_1, list2);
      countrygGridView.setAdapter(adapter2);


 countrygGridView.setOnItemClickListener(new OnItemClickListener()
  {
@Override
public void onItemClick(AdapterView<?> parent, View v,int position, long id) 
    {
     aCountry = (Country) v.getTag();
      for(Country mCountry: countries)
      {
       if(countries.contains(aCountry))
        {
        Toast.makeText(CountryActivity.this, "match", 2000).show();
        }
          }
         }
     });
   }
 }

Country.java (класс модели)

public class Country 
{

private String name;
private String about;
    ArrayList<City> cities;

public Country()
{
    cities = new ArrayList<City>();
}

   public Country(String name, String about)
{
    this.name= name;
    this.about = about;
}


public int getNoOfCities()
{
    return cities.size();
}


public long getNoOfCitizens()
{
       Long aPop= 0L;
    for(City aCity: cities)
    {
             aPop += aCity.getPopulation();
    }
    return aPop;
}



public String getName(){
    return name;

} 
public String getAbout(){
    return about;

} 
}

person Shaon Hasan    schedule 16.01.2014    source источник
comment
Думаю, это решит эту проблему: stackoverflow.com/questions/21164478 /   -  person Shaon Hasan    schedule 16.01.2014


Ответы (5)


В методе onItemClick просто выполните list2.get(position), и вы получите свою страну.

person fweigl    schedule 16.01.2014
comment
Но я добавляю объект в arrayList и адаптер, поэтому в girdview он показывает сам объект. Я хочу показать значения в gridview (имя и информация из класса Country.java). и снова, когда щелкнул listItems в gridview, я хочу получить объект, чтобы мой класс модели мог получить значения из объекта. - person Shaon Hasan; 16.01.2014
comment
Затем вам нужно создать собственный адаптер, который делает это. Простой ArrayAdapter не может знать, что вы хотите отобразить. - person fweigl; 16.01.2014
comment
я правильно сделал? stackoverflow.com/questions/21164478/ : -) - person Shaon Hasan; 16.01.2014

Исправьте свой код

     countrygGridView.setOnItemClickListener(new OnItemClickListener()
      {
    @Override
    public void onItemClick(AdapterView<?> parent, View v,int position, long id) 
        {
                 Country cnt = (Country)countrygGridView.getAdapter().getItem(position);
         });
       }
person Thanh Le    schedule 16.01.2014

В onItemClick для GridView вы получите положение элемента, на который вы нажали.

Country country = countries.get(position);

Ссылка

person Jagadesh Seeram    schedule 16.01.2014

(В методе onItemClick просто введите:

Country aCountry = countries.get(position);

Вы получаете точное совпадение, вам не нужно вручную проверять список, потому что список, который вы установили в адаптере, используется в том же порядке при извлечении элементов в вашем представлении сетки.

Вы должны сравнивать строки, используя «равно», а не «==», использовать && вместо ||, потому что я предполагаю, что вы хотите, чтобы все условия выполнялись одновременно и проверяли значение null перед проверкой фактического значения вашей строки, поэтому замените:

if((txtName!="" || txtName!=null) &&  (txtAbout!="" || txtAbout != null))

С:

if(txtName!=null && !txtName.equals("") &&  txtAbout != null && !txtAbout.equals(""))
person Alexe Mihai    schedule 16.01.2014

Если вы хотите отображать имя и о с помощью ArrayAdapter, вам необходимо переопределить метод toString в классе Country.

String toString() {
  return this.name + " " + this.about;
}
person Kornel    schedule 16.01.2014