【问题标题】:Android Accessing Elements from a Custom ListViewAndroid 从自定义 ListView 访问元素
【发布时间】:2010-12-10 17:23:11
【问题描述】:

这个问题的标题可能很糟糕,但很难确定一个标题。那么问题来了。

我有一个应用程序,它打开一个数据库并根据内容创建一个自定义 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 新手,但从结构上看,这似乎是每个人都建议构建自定义 ListViews 的方式。

如何从 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);
    }
}

【问题讨论】:

    标签: android listview android-layout adapter


    【解决方案1】:

    如何从 列表视图?

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

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

    如果您想区分被单击的列表项和列表项中的可聚焦视图(如复选框),则涉及更多。默认情况下,该复选框将从列表项中取消焦点。您可以切换它并将其设为假,具体取决于您要执行的操作。有关更多信息,请参阅this question

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

    例如:

    MovieAdapter

    MyMovies (ListView)

    然后您只需使用普通的“onListItemClick”和适配器来判断点击了什么,什么没有点击。 (这只是一种方法,有多种方法。)

    【讨论】:

    • 对,CheckBox 占据了 ListView 行的焦点,因此在 XML 文件中我将 CheckBox 设置为 android:focusable="false"。这有效,并允许我收听 ListViews 的短按和长按。但是现在,我如何同时监听 CheckBox 和行?当按下该行时,会弹出一个 ContextMenu,它可以正常工作。但是当 CheckBox 被选中或未选中时,我需要向应用程序发送一条消息以更新数据库。在不激活onClickListener 的情况下如何做到这一点?
    • 我用我最近研究的一个例子更新了答案。我不确定这正是您要问的,但它在列表视图中使用复选框,应该让您朝着正确的方向前进(也许)。
    • @Charlie - 我用主应用程序更新了我的帖子。我确实查看了您引用的示例,但我不完全确定这就是我正在寻找的。问题是我需要进行三个不同的过程。 1-短按 ListView 行时,执行一些执行。 2- 当 ListView 行长按时,拉出一个上下文菜单。 3-检查行中的复选框或未选中,请更新此对象要么活动的数据库或非活动。我已经在实现 onItemClick 和 onItemLongClick 以满足前两个。
    • 续。那么如何添加与行中的 CheckBox 链接的第三个侦听器?
    • 有多种方法。您可以从 onItemClick 返回的“视图”中获取复选框的状态,例如 ((CheckBox) view.findViewById(R.whatever_checkbox_id)),或者,我觉得这更优雅,您可以跟踪该状态在适配器中。这就是我所包含的示例所做的。它维护是否在适配器中检查了某些内容的状态(并且也可以在 onItemClick 中检索它,或者它可以自己执行“更新数据库”部分。
    【解决方案2】:

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

    【讨论】:

    • 不,它不是 CursorAdapter。你能解释一下如何在 getView() 中设置监听器吗?我已经编辑了帖子以包含我的 Adapter 和 AdapterView。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多