我正在使用ListView构建Android应用程序。我有列表视图项目如下所示。
^列出项目索引0
^列出项目索引1
xlm如下。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="4dip" >
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/icon" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="0.93"
android:orientation="vertical"
android:padding="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp" >
<!-- JFN bottom used to be 2, top 6 -->
<!-- Name Label -->
<TextView
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="0dip"
android:paddingTop="0dip"
android:textColor="#43bd00"
android:textSize="16sp"
android:textStyle="bold" />
<!-- Email label -->
<TextView
android:id="@+id/email"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="0dip"
android:textColor="#acacac" />
<!-- Mobile number label -->
<TextView
android:id="@+id/mobile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:text="Mobile: "
android:textColor="#5d5d5d"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right"
android:orientation="vertical" >
<ImageView
android:id="@+id/chat"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="2dip"
android:gravity="right"
android:src="@drawable/chat" />
<ImageView
android:id="@+id/calendar"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="2dip"
android:gravity="right"
android:src="@drawable/calendar" />
</LinearLayout>
</LinearLayout>
我正在尝试检测四种不同的点击事件:
此外,必须根据ListView中的哪个项目单击来区分每个点击次数。
我知道如何区分每个ListItem:我可以使用ListView.setOnItemClickListener,如下所示,它提供列表中项目的id。但这并没有告诉我四个部分中的哪一部分被点击了。
ListView lv = getListView();
// Listview on item click listener
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
Log.d("JFN","List item clicked with id: "+id);
}
});
我还可以将不同的onClick函数调用绑定到xml中的四个部分中的每个部分,但这不会让我知道单击了哪个列表项。
android:onClick="imgClicked"
我认为我不能将这两种解决方案结合起来,因为它会引入竞争条件。有没有一种正确的方法来完成检测单击哪个列表项,以及单击该特定列表项的哪一部分?
以下代码显示了使用适配器创建ListView。
// Retrieve string, convert to JSON, and extract contacts
String jsonData = jsonToStringFromAssetFolder("maemployees.json",this);
JSONObject jsonObj = new JSONObject(jsonData).getJSONObject(TAG_RESULTS);
int numContacts = jsonObj.getInt(TAG_NUM);
Log.d("JFN","Number of contacts stated: "+numContacts);
contacts = jsonObj.getJSONArray(TAG_CONTACTS);
Log.d("JFN","Number of contacts present: "+contacts.length());
// Loop over contacts
for( int i=0; i<contacts.length(); i++) {
// Extract this one
JSONObject c = contacts.getJSONObject(i);
// Extract strings
String first = (c.has(TAG_FIRST)) ? c.getString(TAG_FIRST) : "";
String last = (c.has(TAG_LAST)) ? c.getString(TAG_LAST) : "";
String city = (c.has(TAG_CITY)) ? c.getString(TAG_CITY) : "";
String state = (c.has(TAG_STATE)) ? c.getString(TAG_STATE) : "";
String country = (c.has(TAG_COUNTRY)) ? c.getString(TAG_COUNTRY) : "";
String costName = (c.has(TAG_COST_NAME)) ? c.getString(TAG_COST_NAME) : "";
// Temporary hash map for single contact
HashMap<String, String> contact = new HashMap<String, String>();
contact.put("name", first+" "+last);
contact.put("email", city+", "+state+", "+country);
contact.put("mobile", costName);
// Adding single contact to list
contactList.add(contact);
}
Log.d("JFN","Done looping contacts");
//Updating parsed JSON data into ListView
ListAdapter adapter = new SimpleAdapter(
MainActivity.this, contactList,
R.layout.list_item, new String[] { "name", "email",
"mobile" }, new int[] { R.id.name,
R.id.email, R.id.mobile });
setListAdapter(adapter);
答案 0 :(得分:1)
您必须在适配器中设置列表视图的内容,因此在适配器内部有一个方法getView()
。在getView()
内部定义每个视图,然后在这些视图中设置onCLickListener。
对于Ex:
dog.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//operation to be performed.
}
});
同样将onCLickListeners()
应用于所有其他观看次数。
答案 1 :(得分:1)
好吧我遇到了类似的问题,但我使用 ViewPager
并使用 ListFragment
和自定义{{1}布局。
在上述情况下,您只使用 ListView
,但是如果您使用ImageViews
,ImageButton
,CheckBox
等控件,以防万一会遇到问题here和here。
这只是因为此类控件可以从Button
窃取焦点,并且无法选择/点击完整的列表项。所以我会说只使用 ListView
是明智之举
我假设您使用适配器来设置列表的内容。在该适配器内,您可以为每个项目指定ImageViews
,如下所示:
onClickListener()
但请记住,在使用public class MyListAdapter extends ArrayAdapter<String>{
.......
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView=inflator.inflate(R.layout.channel_list_item, null, true);
ImageView chat=(ImageView) rowView.findViewById(R.id.chat);
chat.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//do something
}
}
ImageView calendar=(ImageView) rowView.findViewById(R.id.calendar);
calendar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//do something
}
}
.......
}
}
,ImageButton
,CheckBox
等控件时,您需要在XML中指定属性 Button
。对于 android:focusable="false"
,您需要在ImageButton
方法中执行此操作:
getView()
或者你也可以使用Nathaniel Waggoner的方法。
希望我回答你的问题。
答案 2 :(得分:0)
如果您不想为每个项目设置单击侦听器,则另一个选项是将点击时传递的视图的view.getId()值与视图的ID进行比较,例如:< / p>
switch(view.getId()){
case(R.id.dog_image):
//do stuff
break;
case(R.id.other_image):
//do stuff
break;
}
否则,您可以通过在onCreate中执行以下操作以编程方式执行此操作:
.....
setContentView(myView);
ImageView dogImage = (ImageView) findViewById(R.id.dog_image);
dogImage.setOnClickListener(new View.OnClickListener {
@Override
public void onClick(View v) {
// do stuff...
}
})
....