OnClickListener:为什么我无法访问ArrayAdapter中对象的公共方法?任何解决方法?

时间:2017-01-21 20:09:05

标签: android listview android-arrayadapter onclicklistener

来自新手的问候。这个问题有点长,对不起。 我的Android应用程序将xml加载到listview,然后在单击任何listview项目后,我想将一些信息传递给第二个活动。与

piesneLVdata.getItemAtPosition(position).toString()

这是我的目标:

public class Piesen {
    private String nazov_piesne;
    private String text_piesne;
}

+一些get和set方法以及toString的覆盖...

我可以访问对象的第一个属性,我可以在第二个活动中使用它。我想这是因为我已经覆盖了我的对象定义中的方法:

@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()方法来包含我的对象的两个属性的数组。你能指点我正确的方向吗?非常感谢。

具体来说,这是我的活动:     公共类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);
            }
        });
}

1 个答案:

答案 0 :(得分:0)

问题在于

piesneLVdata.getItemAtPosition(position)

返回Piesen作为Object处理。 Object有toString方法,所以你可以调用那个被Piesen.class覆盖的方法。

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

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