Android从自定义ListView访问元素

时间:2010-12-10 17:23:11

标签: android listview android-layout adapter

这个问题的标题可能很差,但很难确定标题。所以这就是问题。

我有一个应用程序打开数据库并根据内容创建自定义ListView。因此,此过程涉及一些文件:

Main.java - opens the database and stores the List<MyClass> of contents
main.xml - main activity layout with the ListView
MyAdapter.java - extends BaseAdapter and calls MyAdapterView based on the context
MyAdapaterView.java - inflates the View from MyAdapater based on row.xml
row.xml - layout of each custom row of the ListView

这很好用。我是Android新手,但从结构上看,似乎每个人都建议如何构建自定义ListView。

如何从ListView中检索数据?例如,行的一部分是一个复选框。如果用户按下复选框以激活/停用特定行,如何通知主应用程序?

谢谢,

编辑:

Main.java

public class MyApplication extends Activity 
    implements OnItemClickListener, OnItemLongClickListener
{
    private List<MyClass> objects;
    private ListView lvObjects;
    private MyAdapter myAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        objects = new ArrayList<MyClass>(); // setup the list
        lvObjects = (ListView)findViewById(R.id.lvObjectList);
        lvObjects.setOnItemClickListener(this);
        lvObjects.setOnItemLongClickListener(this);

        loadDatabase(DATABASE);

        myAdapter = new MyAdapter(this, objects);
        lvObjects.setAdapter(myAdapter); 
    }

    ...

    public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
    {       
        // This is executed when an item in the ListView is short pressed
    }

    public void onItemLongClick(AdapterView<?> parent, View v, int position, long id) 
    {
        // This is executed when an item in the ListView is long pressed

        registerForContextMenu(lvObjects);
        v.showContextMenu();
    }

MyAdapter.java

public class MyAdapter extends BaseAdapter
{
    private Context context;
    private List<MyClass> list;

    public RuleAdapter(Context context, List<MyClass> list)
    {
        this.context = context;
        this.list = list;
    }

    ...

    public View getView(int position, View view, ViewGroup viewGroup) 
    {
        MyClass entry = list.get(position);
        return new MyAdapterView(context,entry);
    }
}

MyAdapterView.java

public class MyAdapterView extends LinearLayout
{   
    public MyAdapterView(Context context, MyClass entry) 
    {
        super(context);

        this.setOrientation(VERTICAL);
        this.setTag(entry);

        View v = inflate(context, R.layout.row, null);

        // Set fields based on entry object

        // When this box is checked or unchecked, a message needs to go
        // back to Main.java so the database can be updated
        CheckBox cbActive = (CheckBox)v.findViewById(R.id.cbActive);

        addView(v);
    }
}

2 个答案:

答案 0 :(得分:1)

  

如何从中检索数据   的ListView?

如果您想知道点击ListView中的哪个项目,请使用OnItemClickListenerListview.setOnItemClickListenerHello ListView教程中有一个例子。

一旦您知道选择了哪个项目,就可以知道该项目在整体Adapter中的位置,并且您拥有View。如果需要,您可以使用视图获取子元素,通常情况下,位置足以让您知道单击“模型”的哪个部分。在您的示例中,它会告诉您List<MyClass>中的哪个项目已被点击。

如果你想要区分被点击的列表项和列表项中的可聚焦视图(如复选框),那就更多了。默认情况下,该复选框将从列表项中突出显示焦点。您可以切换此项并将其设为false,具体取决于您要执行的操作。有关详细信息,请参阅this question

如果您需要区分ListView项目单击和CheckBox单击,有几种方法。一种方法是仅维护在适配器内是否单击项目的状态。

例如:

MovieAdapter

MyMovies (ListView)

然后你只需使用普通的“onListItemClick”和适配器来告诉你点击了什么,什么不是。 (这只是一种方法,有几种方法。)

答案 1 :(得分:0)

所以你有一个创建视图的自定义cursoradapter?在getView()中创建视图时,只需在该视图上设置一个侦听器即可侦听您想要的内容。可能是onClick