【问题标题】:How to ignore the click made in row of a listview如何忽略在列表视图的行中所做的点击
【发布时间】:2012-12-24 17:22:49
【问题描述】:

场景:我有 n 个标签,每个标签都有自己的列表视图。我正在使用数组适配器来生成列表视图。传递给 arrayadaper 的数组具有对象数组。每个对象都有一个“菜单”和“菜单类型”。现在基于菜单类型,如果菜单类型是“菜单组”,我将使用不同的布局进行绘制并将背景设置为红色。

问题很简单.. 每当单击列表视图中的菜单组行时,什么都不会发生。换句话说,如何忽略在菜单组行中所做的点击。这需要仅捕获在 onItemClick 方法的菜单行中进行的单击的详细信息。你能给我指出任何想法/线索吗?提前致谢。

public class MyCustomAdapter  extends ArrayAdapter<Menu> {
private ArrayList<Menu> menuItemList; 
Context context;
LayoutInflater vi;

public MyCustomAdapter(Context context ,ArrayList<Menu> menu) {    
    super(context, 0, menu );    
    this.menuItemList = new ArrayList<Menu>();    
    this.menuItemList.addAll(menu); 
    this.context =context;
    vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
    }    

private class ViewHolder {
    TextView menuItem;   
    TextView menuGroup;  
    }

public int getItemViewType(int position) {
    if (menuItemList.get(position).getMenuType().equals("menugroup")) 
        return 0;
    return 1;
}
public int getViewTypeCount() {
    return 2;
}
public View getView(final int position, View convertView, ViewGroup parent) {      
    ViewHolder holder;   
    int type = getItemViewType(position); 

    if (convertView == null) { 
        holder = new ViewHolder();  
        switch (type) {
        case 0:
            convertView = vi.inflate(R.layout.group,  null); 
            holder.menuItem = (TextView) convertView.findViewById(R.id.tvGroup);
            convertView.setBackgroundColor(Color.RED); 
            break;              
        case 1:
            convertView = vi.inflate(R.layout.item,  null); 
            holder.menuItem = (TextView) convertView.findViewById(R.id.tvItem); 
            break; 
         }  
        convertView.setTag(holder); 
    } else {
        holder = (ViewHolder) convertView.getTag();  
    }    

    switch (type) {
    case 0:         
        holder.menuItem.setText(menuItemList.get(position).getItemName()) ; 
        convertView.setBackgroundColor(Color.RED);  
        break;              
    case 1:
        holder.menuItem.setText(menuItemList.get(position).getItemName()) ;  
        break; 
     }

    return convertView; 
    }

}

【问题讨论】:

    标签: android android-layout onitemclicklistener onitemclick


    【解决方案1】:

    覆盖适配器中的 isEnabled() 并为不应被视为交互的任何位置返回 false (docs link)。默认情况下,这会为所有元素返回 true

    【讨论】:

    • 这是给 BaseAdapter 的。我正在使用 arrayAdapter 。这对 ArrayAdapter 有用吗?
    • ArrayAdapterBaseAdapter 的子类。它们都以相同的方式工作。
    【解决方案2】:

    从侦听器中使用适配器的getItemViewType()。如果返回 0,则不要在侦听器中执行任何操作。

    listView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            if (parent.getAdapter().getItemViewType(position) == 0)
                return;
    
            // do something for non-menugroup clicks
        }
    });
    

    【讨论】:

    • @user1822729 我添加了一个示例。但是,isEnabled() 解决方案看起来比我更好。
    • 你的想法是可行的,但我想把这个逻辑保留在适配器类中,因此我使用了 isEnable()
    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2012-06-23
    相关资源
    最近更新 更多