我有一个ViewPager,它包含两个片段。一个fragment
不包含任何内容,而另一个fragment
包含gridview
ImageViews
。
ImageViews
设置了onClickListener
。
到目前为止一切正常......但是当我在片段中没有任何内容并点击其他片段的onClickListener时,即使其元素不可见,imagview也会对我的点击作出反应。
我可以更改我的onClickListener
,以便检查显示哪个片段,但这是我应该这样做的方式吗?感觉有点脏
这是我的FragmentStatePageAdapter
public class OwnPagerAdapter extends FragmentStatePagerAdapter{
private BackgroundImage backgroundImage = new BackgroundImage();
private Apps apps = new Apps();
private Home_Screen ac;
public OwnPagerAdapter(FragmentManager fm, Home_Screen activity) {
super(fm);
this.ac = activity;
}
@Override
public Fragment getItem(int position) {
if(position == 0) {
return backgroundImage;
}else if(position == 1) {
return this.apps;
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
这是我的BaseAdapter
public class AppAdapter extends BaseAdapter {
private AppLauncher launcherListener = new AppLauncher();
private ArrayList<ApplicationInfo> appList;
private Context ctx;
public AppAdapter(ArrayList<ApplicationInfo> listOfApps, Context ctx){
this.appList = listOfApps;
this.ctx = ctx;
}
@Override
public int getCount() {
return this.appList.size();
}
@Override
public Object getItem(int i) {
ImageView v = new ImageView(this.ctx);
v.setImageDrawable(this.appList.get(i).loadIcon(this.ctx.getPackageManager()));
return v;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
if(view != null){
((ImageView) view).setImageDrawable(this.appList.get(i).loadIcon(this.ctx.getPackageManager()));
view.setTag(i);
return view;
}
ImageView v = new ImageView(this.ctx);
v.setImageDrawable(this.appList.get(i).loadIcon(this.ctx.getPackageManager()));
v.setScaleType(ImageView.ScaleType.CENTER);
v.setOnClickListener(launcherListener);
v.setTag(i);
return v;
}
private class AppLauncher implements View.OnClickListener {
@Override
public void onClick(View view) {
ctx.startActivity(ctx.getPackageManager().getLaunchIntentForPackage(appList.get((int) view.getTag()).packageName));
}
}
}
这就是我的片段类
public class Apps extends Fragment implements LoaderManager.LoaderCallbacks<ArrayList<ApplicationInfo>>{
private GridView gridview;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getLoaderManager().initLoader(1, null, this).forceLoad();
View rootView = inflater.inflate(R.layout.fragment_apps, container, false);
this.gridview = (GridView)rootView.findViewById(R.id.apptable);
return rootView;
}
@Override
public Loader<ArrayList<ApplicationInfo>> onCreateLoader(int id, Bundle args) {
return new AppLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<ArrayList<ApplicationInfo>> loader, ArrayList<ApplicationInfo> data) {
Toast.makeText(getActivity(), "Done with loading Apps", Toast.LENGTH_LONG).show();
this.gridview.setAdapter(new AppAdapter(data,getActivity()));
}
@Override
public void onLoaderReset(Loader<ArrayList<ApplicationInfo>> loader) {
}
}
答案 0 :(得分:1)
虽然我无法找到您的问题的任何具体原因,但我必须建议一种更简洁的方法来实现您正在寻求的相同结果,使用内部类来捕获点击事件是肮脏的,而且是不必要的。很有可能使用这种方法也可以解决你的问题。
为什么不在整个gridview上使用OnItemClickListener,而不是使用实现OnClickListener的AppLauncher类然后为每个项目设置它?它将处理每个项目的点击事件,并且仅针对gridview中的项目,因此您不必担心任何泄漏,就像使用内部类一样。
在您的片段中实现OnItemClickListener:
public class Apps extends Fragment implements LoaderManager.LoaderCallbacks<ArrayList<ApplicationInfo>>, OnItemClickListener
然后在你的片段的onCreate中,只需将适配器设置为gridview:
gridview.setOnItemClickListener(this);
并实施必要的方法:
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
getActivity().startActivity(getActivity().getPackageManager().getLaunchIntentForPackage(appList.get(position).packageName));
}
现在你可以从gridview的适配器中删除OnClickListener逻辑,它应该可以正常工作,我猜它也可以解决你的问题,即使不是,嘿,至少你最终会得到一个更干净的代码。
我对你的代码感到奇怪的另一件事是你重写getItemId()但总是返回0,确保这是你正在寻找的正常行为,因为我不确定它是什么。
祝你好运。