我使用联系人同步创建了一个应用。我列出了以下联系信息,包括照片,姓名和号码。我已成功将所有这些内容列在自定义 ListView 中,但我无法点击 ListView 。它看起来像锁定,无法点击它。
但我对另一项活动做了同样的程序。使用自定义 ListView ,但我可以单击此视图,它可以正常工作。
有什么问题?这是我的样本编码:
ListView settingsList = (ListView) findViewById(R.id.manage_track_listView);
ArrayList<ContactList> MySettingsList = new ArrayList<ContactList>();
ContactList setting1 = new ContactList("contact name 1", "Number 1", null);
ContactList setting2 = new ContactList("contact name 2", "Number 2", null);
ContactList setting3 = new ContactList("contact name 3", "Number 3", null);
MySettingsList.add(setting1);
MySettingsList.add(setting2);
MySettingsList.add(setting3);
ContactList list[] = new ContactList[MySettingsList.size()];
for(int i=0;i<MySettingsList.size();i++) {
ContactList mySettings = MySettingsList.get(i);
list[i] = new ContactList(mySettings.getName(), mySettings.getNumber(), mySettings.getImageIcon());
}
ContactListAdapter adapter = new ContactListAdapter(this, R.layout.manage_track_list_custom_view, list);
settingsList.setAdapter(adapter);
System.out.println("before listener");
settingsList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
System.out.println("Clicked " + position);
}
});
System.out.println("after listener");
此处ContactList是一个类,其中包含imageBlob的联系人姓名,编号和字节[]。如果图像为空,我将默认ic_launcher设置为联系人图像。适配器类是:
public class ContactListAdapter extends ArrayAdapter<ContactList> {
Context context;
int layoutResourceId;
ContactList objects[] = null;
View row;
public ContactListAdapter(Context context, int layoutResourceId, ContactList[] objects) {
super(context, layoutResourceId, objects);
// TODO Auto-generated constructor stub
this.context = context;
this.layoutResourceId = layoutResourceId;
this.objects = objects;
System.out.println(objects[1].getName());
System.out.println(objects[1].getNumber());
System.out.println(objects[1].getImageIcon());
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
row = convertView;
final ContactListHolder holder;
if ( row == null ) {
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ContactListHolder();
holder.image = (ImageView) row.findViewById(R.id.contactImage);
holder.name = (TextView) row.findViewById(R.id.contactName);
holder.number = (TextView) row.findViewById(R.id.contactNumber);
holder.check = (CheckBox) row.findViewById(R.id.selectedContact);
row.setTag(holder);
} else {
holder = (ContactListHolder)row.getTag();
}
ContactList contact = objects[position];
if(contact.imageIcon != null) {
Bitmap imgBitmap = BitmapFactory.decodeByteArray(contact.imageIcon, 0, contact.imageIcon.length);
holder.image.setImageBitmap(imgBitmap);
} else {
holder.image.setImageResource(R.drawable.ic_launcher);
}
holder.name.setText(contact.name);
holder.number.setText(contact.number);
holder.check.setChecked(objects[position].isSelected());
return row;
}
static class ContactListHolder {
ImageView image;
TextView name;
TextView number;
CheckBox check;
}
}
我有超过100个联系人,所以只添加了3个对象。在此联系人列表中,我成功收到了联系人图片,姓名,号码。
ListView 无法点击的问题是什么?我希望你们中的任何一个人能指导我。提前谢谢。
感谢所有人。现在只需在我的所有子视图中添加android:focusable="false"
即可获得结果。谢谢你的指导。
答案 0 :(得分:9)
在嵌套视图中,子视图始终首先获取所有触摸事件。如果您想要父视图(在您的情况下是listView行),要获得触摸事件,您必须在子事件上返回false或在清单中将它们设置为android:clickable="false"
。
答案 1 :(得分:7)
添加
android:focusable="false"
和
android:clickable="false"
对于每个子视图,例如imageview,textview,checkbox等...您的行布局意味着 manage_track_list_custom_view.xml
答案 2 :(得分:3)
我认为您必须设置所有可点击的内容,例如。复选框,按钮等不可聚焦(在适配器类中)。
holder.yourButton.setFocusable(false);
holder.yourButton.setFocusableInTouchMode(false);
holder.yourCheckbox.setFocusable(false);
holder.yourCheckbox.setFocusableInTouchMode(false);
答案 3 :(得分:1)
答案 4 :(得分:0)
您可以将onclick侦听器设置为Contact ListAdapter类中的View行。
holder.check.setChecked(objects[position].isSelected());
row.setOnclickListner(new Onclicklistner(){
// Your code here
});
return row;
答案 5 :(得分:0)
当我无法点击列表视图中项目的其他部分时,我遇到同样的问题,只需点击该项目内的textview或imageview即可。所以我设置了我的textview:
android:layout_width="fill_parent"
我的项目是这样的:
<relative>
[image][textview]
relative/>
点击事件工作正常,因为我点击了textview。希望能帮助任何人解决同样的问题。