当用户选择ListView的项目时,如何查找底层对象?

时间:2015-09-05 03:06:19

标签: android listview

我正在学习Android编程。 该活动有一个ListView,其中每个项目只是一个TextView。此ListView由一个自定义适配器填充,该适配器遍历cRecord的ArrayList,并为每个TextView设置适当的文本。 这个类cRecord有很多"字段" (成员),例如人名,电话号码......但只有人名在ListView上显示。 现在,当用户单击ListView以选择某个人时,我们如何才能到达与该人对应的cRecord类型的源对象?

2 个答案:

答案 0 :(得分:0)

我试图通过构建需求的原型来解决这个问题。

我认为这个是你的cRecord课程:

public class cRecord{
    String name;
    String phoneNo;

    //GETTERS AND SETTERS IF ANY
    //METHOD IMPLEMENTATIONS IF ANY

}

您可以在活动中使用getObject方法,该方法将从cRecord列表中返回一个对象,用于填充ListAdapter:

public cRecord getObject(String name){
    forech(cRecord c   : listcRecord){
        if(c.name == name){
            return c;
        }
    }
    return null;
}

最后,在listview的OnListItemClicked监听器中,您可以像这样获取被点击的对象:

ListView lv = (ListView)findViewById(R.id.listView1);
    lv.setAdapter(new ArrayAdapter<Country>(
            this,R.layout.list_black_text,R.id.list_content, values));  //values is the list holding objects of cRecord and R.id.list_content is the textview which you are using in your list to show the name.

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
            TextView textView = (TextView) view.findViewById(R.id.list_content);
            String text = textView.getText().toString(); //Getting the text of view being clicked.
            cRecord clickedObject = getObject(text); //Calling your getObject method here.
    Toast.makeText(this,"phoneNo of " + clickedObject.phoneNo, Toast.LENGTH_SHORT).show();
   }});

如果这没有帮助,您可以提及自己的代码,以便更清楚地提出问题。

答案 1 :(得分:0)

首先,您需要使用ListView OnItemClickListener callback Object方法设置setOnItemClickListener(AdapterView.OnItemClickListener listener)

OnItemClickListener是一个具有一种方法的接口: onItemClick(AdapterView the_list, View view_clicked, int position_of_view_clicked, long id);

如果您使用自定义Adapter,则提供的ID将是Adapter#getItemId(int position)方法返回的ID。

此外,您还可以设置自定义适配器getItem(int position)以返回特定的对象。可以通过AdapterView#getItemAtPosition(int position)在OnItemClickListener回调对象中访问此对象。

一个例子是:

定义回调

import android.widget.AdapterView;
...

public class ... {
  class ListCallback implements AdapterView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> list, View list_element, int position, long id)  {
      // Operations to access the appropriate record and show it
      // To get the Adapter#getItem(int) result, use
      // ObjectClass a = (ObjectClass) list.getItemAtPosition(position)
    }
  }
}

设置回调

import android.widget.ListView;

...

public class ... {
  private ListView the_list;

  /* method where the list is managed() */
    the_list = (ListView) findViewById(R.id.list_id);
    the_list.setOnItemClickListener(new ListCallBack());

}

请注意,回调对象是标准对象。

您还可以一次定义回调对象,如下所示:

import android.widget.AdapterView;
import android.widget.ListView;
...

public class ... {
  private ListView the_list;

  /* method where the list is managed() */
    the_list = (ListView) findViewById(R.id.list_id);
    the_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> list, View list_element, int position, long id)  {
      // Operations to access the appropriate record and show it
      // To get the Adapter#getItem(int) result, use
      // ObjectClass a = (ObjectClass) list.getItemAtPosition(position)
    });

}