这个问题的标题可能很差,但很难确定标题。所以这就是问题。
我有一个应用程序打开数据库并根据内容创建自定义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);
}
}
答案 0 :(得分:1)
如何从中检索数据 的ListView?
如果您想知道点击ListView
中的哪个项目,请使用OnItemClickListener
和Listview.setOnItemClickListener
。 Hello ListView教程中有一个例子。
一旦您知道选择了哪个项目,就可以知道该项目在整体Adapter
中的位置,并且您拥有View
。如果需要,您可以使用视图获取子元素,通常情况下,位置足以让您知道单击“模型”的哪个部分。在您的示例中,它会告诉您List<MyClass>
中的哪个项目已被点击。
如果你想要区分被点击的列表项和列表项中的可聚焦视图(如复选框),那就更多了。默认情况下,该复选框将从列表项中突出显示焦点。您可以切换此项并将其设为false,具体取决于您要执行的操作。有关详细信息,请参阅this question。
如果您需要区分ListView项目单击和CheckBox单击,有几种方法。一种方法是仅维护在适配器内是否单击项目的状态。
例如:
然后你只需使用普通的“onListItemClick”和适配器来告诉你点击了什么,什么不是。 (这只是一种方法,有几种方法。)
答案 1 :(得分:0)
所以你有一个创建视图的自定义cursoradapter?在getView()
中创建视图时,只需在该视图上设置一个侦听器即可侦听您想要的内容。可能是onClick