2014-01-16 42 views
0

我有一个活动,名为countryActivity和一个名为Country的模型类。我想在模型类中设置值并将每个对象存储在数组列表中,并在gridview中显示对象值。当项目将被点击,然后我想检索对象。以下是我的代码。我出了什么问题或做什么?帮助我出去吗?如何从GridView中获取对象itemClick

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; 

} 
} 
+0

认为这将解决这个问题: http://stackoverflow.com/questions/21164478/customadapter-for-object-isnt-working –

回答

1

onItemClick方法中,只需执行list2.get(position)并且您拥有您的国家。

+0

但我将在ArrayList和适配器的对象,所以在girdview它展示了对象本身。我想在gridview(name和Country.java类中的about)中显示值。并再次当gridview中的listItems点击我想获得对象,所以我可以我的模型类从对象中检索值。 –

+0

然后你必须创建一个自定义的适配器。简单的ArrayAdapter无法知道你想要显示什么。 – FWeigl

+0

我做对了吗? HTTP://计算器。com/questions/21164478/customadapter-for-object-isnt-working :-) –

0

修复您的代码

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

onItemClickGridView,您将获得该项目的位置你点击

Country country = countries.get(position); 

Refer this

0

(在onItemClick方法,只是把:

Country aCountry = countries.get(position); 

当您在网格视图中检索项目时,您确实会得到一个匹配项,因为您在适配器中设置的列表以相同顺序使用,所以无需手动检查列表。

您应该使用“equals”而不是“==”比较字符串,使用& &而不是||,因为我想您希望所有条件同时发生并在检查字符串的实际值之前检查null ,所以更换:

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

有了:

if(txtName!=null && !txtName.equals("") && txtAbout != null && !txtAbout.equals("")) 
0

如果你想显示使用 ArrayAdapter,你必须重写Country类中的toString方法。

String toString() { 
    return this.name + " " + this.about; 
}