我正在尝试将 fragment 和 ListView 与数组适配器一起使用,并且无法从数组适配器中的onClickListener调用我的方法。
如果我正确理解了模式,那么一个 fragment 应该是自给自足的,因此我想在其中放置业务逻辑。但是我无法从阵列适配器调用它。如果将其放在主 Activity 中,可以调用它,但这是否不妨碍我在另一个 Activity 中使用该 fragment 并破坏范例?
我的业务逻辑是否放置在错误的地方,或者我没有正确地调用它?
这是我的ArrayAdapter;
public class RecipientsListAdapter extends ArrayAdapter<Recipient>{
Context context;
int layoutResourceId;
Recipient data[] = null;
public RecipientsListAdapter(Context context, int layoutResourceId, Recipient[] data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
RecipientHolder holder = null;
final boolean isLastRow = (position == data.length-1);
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new RecipientHolder();
holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
row.setTag(holder);
}
else
{
holder = (RecipientHolder)row.getTag();
}
final Recipient recipient = data[position];
holder.txtTitle.setText(recipient.displayName);
holder.imgIcon.setImageResource(recipient.icon);
row.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivity)context).onChildItemSelected(position);
if(isLastRow){
//((RecipientsFragment).getContext()).launchContactPicker();
((MainActivity)context)).launchContactPicker();
}
else{
Toast.makeText(getContext(), recipient.displayName, Toast.LENGTH_SHORT).show();
}
}
});
return row;
}
最佳答案
Adapter
不应调用任何单击监听器,也不应在getView()
方法中附加单击监听器。相反,您应该使用ListFragment
,并且只需覆盖 fragment 中的 onListItemClick()
即可。然后,您可以通过调用监听器接口(interface)回调将该事件调度到Activity
,或者直接在Fragment中处理它。如果要在SDK 11发行之前支持Android版本,也可以使用support library。
关于android - 我的业务逻辑应该放在上面的 fragment 中还是在上面的 Activity 中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14427482/