如何根据单击行内的视图来处理onListItemClick(...)?

时间:2014-01-09 15:21:03

标签: android android-layout listview android-listview

问题

我在DialogFragment中有一个listView,我只想在一行内的某些特定项被触发时才触发某些回调。我怎么能这样做?

基本上,我想做这样的事情

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    final int viewId = view.getId();
    if ((viewId == R.id.textView1) || (viewId == R.id.textView2)) {
        // do something...
    }

我不能。如果您不知道原因,请进一步阅读。

我尝试了什么

我试着查看文档,但是OnItemClickListener回调没有提供精确点击的视图作为参数(您可以在签名中看到的视图是整行)。

此外,我尝试在适配器中的单个视图上设置一个简单的onClick回调,但这会覆盖listSelector和列表应具有的其他行为。阅读文档,我发现它是明确写的,我们应该通过onListItemClick(...)方法设置回调(而不是通过onClick(...)),所以我正在寻找一种方法来做到这一点,使用这种方法,不要覆盖任何默认列表行为。

我试图通过处理xml来完成这项工作。令我惊讶的是,我发现如果我将视图android:clickable属性设置为true,则onListItemClick回调将不会触发(我认为它是相反的), 因此,部分解决方案是将行中的每个视图设置为android:clickable=true,而不是我想要触发回调的那个视图,但这不是解决方案,因为如果用户单击有填充或空格的位置,回调将开火。另外,我发现如果我将行的视图的父级设置为android:clickable=true并且我想要使用回调到android:clickable=false来处理的子视图,这将不起作用,因为显然该属性不是覆盖。

编辑很抱歉这个问题以前的标题非常糟糕,我甚至没有注意到我提交了这个问题。

2 个答案:

答案 0 :(得分:0)

新答案,希望我现在明白了:)

在适配器getView中,将OnClickListener附加到要触发的布局中的任何视图。 (更多伪代码)

public class Adapter extends ArrayAdapter<XYZ> {

    private int resource;

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView==null) convertView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(this.resource, parent, false);

        ((Button)convertView.findViewById(R.id.YOUR_BUTTON_IN_LAYOUT)).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                DOSTUFF();
            }
        });

        return convertView ;
    }


}

旧答案: 该位置表示您在列表中的位置(伪代码)。

listView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, final int position,long arg3) {

        YOUR_ITEM_BACKED_BY_ADAPTER item = listView.getItemAtPosition(position);

        if(item==THE_FIRST_ITEM_IN_LIST) doSomething();
        else if(item == THE_LAST_ITEM_IN_LIST) doSomethingElse();               
    }

});

答案 1 :(得分:0)

您可以在适配器的getView

中为其他视图设置侦听器
public class MyAdapter extends ArrayAdapter<MyItem> implements View.OnClickListener  {
    public View getView(int position, View convertView, ViewGroup parent) {

        // setup the converView inflating it, for simplicity I've removed that code

        MyItem item = getItem(position);
        text1 = (TextView)convertView.findViewById(R.id.text1);
        text2 = (TextView)convertView.findViewById(R.id.text2);
        text1.setOnClickListener(this);
        // pass the item to use when clicked
        text1.setTag(item);

        text2.setOnClickListener(this);
        text2.setTag(item);
    }


    public void onClick(View v) {
        MyItem item = v.getTag();

        switch (v.getId()) {
            case R.id.text1:
                download(item);
                break;
            case R.id.text2:
                upload(item);
                break;
        }
    }
}

而不是在适配器内部执行硬编码操作(例如download),您可以将接口传递给它,例如调用活动可以实现该接口