【问题标题】:Multi-touch in ListView containing EditText and CheckBox on each row item (Android)ListView 中的多点触控,每个行项上包含 EditText 和 CheckBox (Android)
【发布时间】:2014-08-12 09:37:04
【问题描述】:

我有一个 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 点击监听器似乎在所有情况下都有效(奇怪)。我是新手,任何形式的帮助都将不胜感激。我现在无法发布来源,请多多包涵。任何解决方案、建议或解释都会有很大帮助。

【问题讨论】:

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


    【解决方案1】:

    我很高兴我碰巧解决了这个问题。我想要做的是(让我再次清除它)我希望 EditText 是可聚焦的,此外我应该能够单击 ListView 的每一行来执行一些特定的任务。好吧,我们不需要这些属性:

    android:focusable=""  
    android:focusableInTouchMode=""  
    android:descendantFocusability=""  
    

    需要做的很简单
    在您的自定义 ListAdapter 类中,为每个项目(例如 EditText、CheckBox 等)实现 OnClickListener 并实现 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
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多