OnClickListener:为什么我无法访问 ArrayAdapter 中对象的 public 方法?任何解决方法?
OnClickListener: Why I cannot access public methods of the object in ArrayAdapter? Any workaround?
来自新手的问候。这个问题有点长,不好意思。
我的 android 应用程序将 xml 加载到列表视图,然后在单击任何列表视图项目后我想将一些信息传递给第二个 activity。有
piesneLVdata.getItemAtPosition(position).toString()
这是我的对象:
public class Piesen {
private String nazov_piesne;
private String text_piesne;
}
+ 一些获取和设置方法以及对 toString 的覆盖...
我可以访问对象的第一个 属性,我可以在第二个 activity 中使用它。我想这是因为我重写了对象定义中的方法:
@Override
public String toString() {
return nazov_piesne;
}
但是我无法访问我的对象的第二个 属性。试过这个:
piesneLVdata.getItemAtPosition(position).getTextPiesne()
但 getTextPiesne() 似乎无法访问 - 那么为什么 "toString()" 可以访问?信息就在那里,我可以使用以下公式在 onClickListener 之外访问它:
zoznamPiesni.get(position).getText_piesne().toString();
但是当我尝试在 onClickListener 中使用它时出现错误:
Error:(64, 45) error: local variable zoznamPiesni is accessed from within inner class; needs to be declared final
但是,当我声明它为 final 时,我无法将 xml 文件加载到其中。我觉得正式卡在那里。也许我应该重新设计 toString() 方法以包含我的对象的两个属性的数组。你能给我指出正确的方向吗?非常感谢。
具体来说,这是我的activity:
public class ListActivity 扩展 AppCompatActivity {
ListView piesneLVdata;
Toolbar nadpis;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
nadpis = (Toolbar) findViewById(R.id.toolbar);
nadpis.setTitle(getResources().getString(R.string.nadpis));
piesneLVdata = (ListView) findViewById(R.id.piesneLVgui);
List<Piesen> zoznamPiesni = null;
try {
XMLPullParserHandler parser = new XMLPullParserHandler();
zoznamPiesni = parser.parse(getAssets().open("piesne.xml"));
//sort the collection piesne alphabetically a-z
Collections.sort(zoznamPiesni, new Comparator<Piesen>() {
@Override
public int compare(Piesen a1, Piesen a2) {
// String implements Comparable
return (a1.getNazov_piesne().toString()).compareTo(a2.getNazov_piesne().toString());
}
});
ArrayAdapter<Piesen> adapter = new ArrayAdapter<Piesen>(this,android.R.layout.simple_list_item_1,zoznamPiesni);
piesneLVdata.setAdapter(adapter);
}catch (IOException e) {
e.printStackTrace();
}
piesneLVdata.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent slovaIntent = new Intent(ListActivity.this, SongActivity.class);
Bundle balik = new Bundle();
balik.putString("NAZOV", piesneLVdata.getItemAtPosition(position).toString());
//balik.putString("TEXT", piesneLVdata.getItemAtPosition(position).getTextPiesne());
// balik.putString("TEXT", zoznamPiesni.get(position).getText_piesne().toString());
slovaIntent.putExtras(balik);
startActivity(slovaIntent);
}
});
}
问题是
piesneLVdata.getItemAtPosition(position)
return Piesen
被视为 Object
。 Object
有 toString 方法,所以你可以调用那个被 Piesen.class
覆盖的方法。
您只需将对象转换为 Piesed
,如下所示:
((Piesen)piesneLVdata.getItemAtPosition(position)).getTextPiesne()
来自新手的问候。这个问题有点长,不好意思。 我的 android 应用程序将 xml 加载到列表视图,然后在单击任何列表视图项目后我想将一些信息传递给第二个 activity。有
piesneLVdata.getItemAtPosition(position).toString()
这是我的对象:
public class Piesen {
private String nazov_piesne;
private String text_piesne;
}
+ 一些获取和设置方法以及对 toString 的覆盖...
我可以访问对象的第一个 属性,我可以在第二个 activity 中使用它。我想这是因为我重写了对象定义中的方法:
@Override
public String toString() {
return nazov_piesne;
}
但是我无法访问我的对象的第二个 属性。试过这个:
piesneLVdata.getItemAtPosition(position).getTextPiesne()
但 getTextPiesne() 似乎无法访问 - 那么为什么 "toString()" 可以访问?信息就在那里,我可以使用以下公式在 onClickListener 之外访问它:
zoznamPiesni.get(position).getText_piesne().toString();
但是当我尝试在 onClickListener 中使用它时出现错误:
Error:(64, 45) error: local variable zoznamPiesni is accessed from within inner class; needs to be declared final
但是,当我声明它为 final 时,我无法将 xml 文件加载到其中。我觉得正式卡在那里。也许我应该重新设计 toString() 方法以包含我的对象的两个属性的数组。你能给我指出正确的方向吗?非常感谢。
具体来说,这是我的activity: public class ListActivity 扩展 AppCompatActivity {
ListView piesneLVdata;
Toolbar nadpis;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
nadpis = (Toolbar) findViewById(R.id.toolbar);
nadpis.setTitle(getResources().getString(R.string.nadpis));
piesneLVdata = (ListView) findViewById(R.id.piesneLVgui);
List<Piesen> zoznamPiesni = null;
try {
XMLPullParserHandler parser = new XMLPullParserHandler();
zoznamPiesni = parser.parse(getAssets().open("piesne.xml"));
//sort the collection piesne alphabetically a-z
Collections.sort(zoznamPiesni, new Comparator<Piesen>() {
@Override
public int compare(Piesen a1, Piesen a2) {
// String implements Comparable
return (a1.getNazov_piesne().toString()).compareTo(a2.getNazov_piesne().toString());
}
});
ArrayAdapter<Piesen> adapter = new ArrayAdapter<Piesen>(this,android.R.layout.simple_list_item_1,zoznamPiesni);
piesneLVdata.setAdapter(adapter);
}catch (IOException e) {
e.printStackTrace();
}
piesneLVdata.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent slovaIntent = new Intent(ListActivity.this, SongActivity.class);
Bundle balik = new Bundle();
balik.putString("NAZOV", piesneLVdata.getItemAtPosition(position).toString());
//balik.putString("TEXT", piesneLVdata.getItemAtPosition(position).getTextPiesne());
// balik.putString("TEXT", zoznamPiesni.get(position).getText_piesne().toString());
slovaIntent.putExtras(balik);
startActivity(slovaIntent);
}
});
}
问题是
piesneLVdata.getItemAtPosition(position)
return Piesen
被视为 Object
。 Object
有 toString 方法,所以你可以调用那个被 Piesen.class
覆盖的方法。
您只需将对象转换为 Piesed
,如下所示:
((Piesen)piesneLVdata.getItemAtPosition(position)).getTextPiesne()