我有一个ListView,其中每个行项都有EditText和CheckBox元素。您可以在下面看到示例图片。
我打算做的是
我想实现OnItemClickListener(用于ListView)和OnClickListener(用于EditText和CheckBox),即我希望在单击ListView项目(EditText和CheckBox外部)时完成任务A,我还想在单击时执行单独的任务分别是EditText和CheckBox。
我的问题
如果在ListView,EditText或CheckBox上没有设置任何属性来控制焦点,那么默认行为是ListView行项目不会听取项目点击,但EditText和CheckBox正在获得焦点
在玩这些属性和那些值(例如 - )
// to ListView
android:descendantFocusability="blocksDescendants"
// to EditText and CheckBox
android:focusable="false"
android:focusableInTouchMode="true"
监听器正在为ListView或EditText工作。 CheckBox点击监听器似乎适用于所有情况(奇怪)。我是新手,任何形式的帮助将不胜感激。我现在不能发布消息来源,因为请耐心等待。任何解决方案,建议或解释都会有很大的帮助。
答案 0 :(得分:1)
我很高兴我碰巧解决了这个问题。我想要做的是(让我再说一遍)我希望EditText可以聚焦,此外我应该能够点击ListView的每一行来执行一些特定的任务。好吧,我们不需要这些属性:
android:focusable=""
android:focusableInTouchMode=""
android:descendantFocusability=""
需要做的简单是
在你自定义ListAdapter类中为每个项目实现OnClickListener(比如EditText,CheckBox等)并实现rootView的OnClickListener(即对于ListView行项目)。
例如:
public class CustomListAdapter extends ArrayAdapter<YOUR_OBJECT> {
Context context;
ArrayList<YOUR_OBJECT> itemlist = new ArrayList<YOUR_OBJECT>();
Integer resourceID;
ViewHolder holder;
public ServicesListAdapter(Context context, int resourceId, ArrayList<YOUR_OBJECT> itemlist) {
super(context, resourceId, itemlist);
this.itemlist.addAll(itemlist);
this.context = context;
this.resourceID = resourceId;
}
public class ViewHolder {
TextView name;
EditText editText;
CheckBox checkBox;
}
public View getView(final int position, View rootView, ViewGroup parent) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (rootView == null) {
rootView = mInflater.inflate(resourceID, null);
holder = new ViewHolder();
holder.name = (TextView) rootView.findViewById(R.id.name);
holder.editText = (EditText) rootView.findViewById(R.id.port);
holder.checkBox = (CheckBox) rootView.findViewById(R.id.check_box);
// Add Listeners for EditText and CheckBox here
rootView.setTag(holder);
} else {
holder = (ViewHolder) rootView.getTag();
}
// Click Listener for the ListView row item
rootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, "Clicked" + position, Toast.LENGTH_SHORT).show();
}
});
// Do what rest you need to do with your ViewHolder
}
}