Android ViewPager onClickListener即使其他片段显示

时间:2015-07-02 08:02:34

标签: android android-fragments android-viewpager onclicklistener

我有一个ViewPager,它包含两个片段。一个fragment不包含任何内容,而另一个fragment包含gridview ImageViewsImageViews设置了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) {

}
}

1 个答案:

答案 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,确保这是你正在寻找的正常行为,因为我不确定它是什么。

祝你好运。