问题
我在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
来处理的子视图,这将不起作用,因为显然该属性不是覆盖。
编辑很抱歉这个问题以前的标题非常糟糕,我甚至没有注意到我提交了这个问题。
答案 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
),您可以将接口传递给它,例如调用活动可以实现该接口