ListView中的多点触控,包含每个行项目上的EditText和CheckBox(Android)

时间:2014-08-12 09:37:05

标签: android android-listview android-edittext onitemclicklistener android-checkbox

我有一个ListView,其中每个行项都有EditText和CheckBox元素。您可以在下面看到示例图片。

enter image description here 我打算做的是

我想实现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点击监听器似乎适用于所有情况(奇怪)。我是新手,任何形式的帮助将不胜感激。我现在不能发布消息来源,因为请耐心等待。任何解决方案,建议或解释都会有很大的帮助。

1 个答案:

答案 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

    }
}