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 被视为 ObjectObject 有 toString 方法,所以你可以调用那个被 Piesen.class 覆盖的方法。

您只需将对象转换为 Piesed,如下所示:

((Piesen)piesneLVdata.getItemAtPosition(position)).getTextPiesne()