我有一个包含大量行的Android ListView。每行包含一个图像和一些文本。如果我单击行的图像,我想执行操作A,如果我单击行中的任何其他位置,我想执行操作B.这两个操作都需要ListView项的id才能工作。
到目前为止,对于操作B,我只使用了listview' JAVA_HOME
,其中我从参数中获取了id。但是,据我所知,找出用户单击的行本身中哪个视图的唯一方法是向ImageView添加一个onItemClick
事件处理程序,触发操作A.在这种情况下,我只获取被单击的视图 - 不是ImageView所在行的ID。
我的问题是 - 如何从View对象转到获取ListView中父行的id?
答案 0 :(得分:2)
onItemClickListener
方法已经onClick interface
传递了view
和position
:您可以通过执行{{1}来查看已点击的视图单击特定视图时声明并执行专用操作。
E.g。
switch
如How to create listview onItemclicklistener
所示您会在listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
String item = listView.getItemAtPosition(position);
Toast.makeText(this,"You selected : " + item,Toast.LENGTH_SHORT).show();
}
});
界面中看到onItemClick
作为参数,View view
作为参数,使用这两个参数在侦听器内执行操作。就像我之前提到的那样,你可以使用int position
语句。
switch
更新:所有功劳归功于How to know which view inside a specific ListView item that was clicked中的wwfloyd
listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
String item = listView.getItemAtPosition(position);
switch(view.getId()) {
case R.id.imageView:
//perform action for imageView using the data from Item (if you have used an MVC pattern)
break;
// you can do this for any widgets you wish to listen for click actions
}
}
});
适配器中的将单击侦听器应用于元素,然后触发接口方法,以便您可以识别已单击的已注册窗口小部件,然后在@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
// Check if an existing view is being reused, otherwise inflate the view
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.one_line, parent, false);
}
// This chunk added to get textview click to register in Fragment's onItemClick()
// Had to make position and parent 'final' in method definition
convertView.findViewById(R.id.someName).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((ListView) parent).performItemClick(v, position, 0);
}
});
// do stuff...
}
中执行:
onItemClick
答案 1 :(得分:1)
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long id)
在此方法中,View arg1为您提供了Item视图,您可以通过此arg1.findViewById(R.id.content);找到项目内容。这里的位置为您提供列表视图的项目位置
答案 2 :(得分:1)
如果你没有使用标签,那么你可以
SELECT * FROM [REMOTESERVER].localdb.dbo.localtablename;
并在您的自定义int itemId=...;
OnClickListener customOnClick=...;
imageView.setTag(itemId);
imageView.setOnClickListener(customOnClick);
OnClickListener
请注意,您可以将“任意”int itemId = (Integer) view.getTag();
设置为标记,这样您甚至可以设置整个自定义对象,而不仅仅是id
答案 3 :(得分:0)
您可以从适配器中的getView()方法为一行中的每个视图设置单击侦听器。
答案 4 :(得分:0)
你可以在listview适配器的getView()方法中实现它。