从pager中删除项目查看android

时间:2016-06-11 15:05:10

标签: android android-viewpager

首先这是我的活动

public class Main extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

     viewpager = (ViewPager)findViewById(R.id.pager);
    swipeadapter = new swipeadapter(this);

    viewpager.setAdapter(swipeadapter);


    //some condition remove textview or hide textview from current Pagerview
    //position 
    //if(mm = oo){ //remove item from current pagerView adapter }




}
}

和我的适配器代码

import android.app.Activity;
import android.content.Context;
import android.graphics.Point;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.util.SparseArray;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;

import java.util.ArrayList;
import java.util.Calendar;

import ws.design.com.R;


public class swipeadapter extends PagerAdapter {

private Context ctx;
private LayoutInflater layoutInflater;
private LinearLayout player;
SparseArray<Fragment> registeredFragments = new SparseArray<>();


    public swipeadapter(Context c){
        this.ctx = c;

    }



    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }

    @Override
    public boolean isViewFromObject(View view, Object o) {
        return (view == (LinearLayout)o);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        registeredFragments.remove(position);
        container.removeView((LinearLayout)object);
    }

    public void changeVisiblityOfTextView(int visiblity)
    {
        player.setVisibility(View.GONE);
    }



    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        registeredFragments.put(position, fragment);

        layoutInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View inflatedView = layoutInflater.inflate(R.layout.player, container,false);
        player = (LinearLayout)inflatedView.findViewById(R.id.buttons);

        Display display =  ((Activity)ctx).getWindowManager().getDefaultDisplay();
        final Point size = new Point();
        display.getSize(size);








        container.addView(inflatedView);
        return inflatedView;
    }

    @Override
    public int getCount() {
        return 10;
    }

    void setSimpleList(ListView listView){

        ArrayList<String> contactsList = new ArrayList<String>();

        for (int index = 0; index < 10; index++) {
            contactsList.add("I am @ index " + index + " today " + Calendar.getInstance().getTime().toString());
        }

        listView.setAdapter(new ArrayAdapter<String>(ctx,
                R.layout.fb_comments_list_item, android.R.id.text1,contactsList));
    }
}

我有pagerView,它的工作目前还不错,但我想隐藏当前PagerView位置的项目,如果条件为true,我怎么能隐藏带有id hideView的textView来自此活动主页

2 个答案:

答案 0 :(得分:1)

SparseArray的适配器中定义ViewPager以保留下面的片段实例:

SparseArray<Fragment> registeredFragments = new SparseArray<>();

注意:为什么选择SparseArray? https://developer.android.com/reference/android/util/SparseArray.html

覆盖instanstiateItem的{​​{1}}方法,如下所示:

FragmentPagerAdapter

并覆盖 @Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); registeredFragments.put(position, fragment); return fragment; } 方法:

DestroyItem

定义一个获取当前片段的方法,如下所示:

@Override
   public void destroyItem(ViewGroup container, int position, Object object) {
      registeredFragments.remove(position);
      super.destroyItem(container, position, object);
   }

如果条件为public Fragment getRegisteredFragment(int position) { return registeredFragments.get(position); } ,则定义一种公共方法,以更改TextViews Fragments的可见度

True

将新的onPageChangeListener添加到public void changeVisiblityOfTextView(int visiblity) { mTextView.setVisiblity(visibility); }

ViewPager

我希望我的回答可以帮到你。祝你好运!

修改:

您设置为查看寻呼机的

YourPagerAdapter: FragmentPagerAdapter或FragmentStatePagerAdapter。

YourFragment:这是您从 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { YourFragment fragment = (YourFragment)yourPagerAdapter.getRegisteredFragment(position); if(yourCondition){ fragment.changeVisiblityOfTextview(View.VISIBLE); } else{ fragment.changeVisiblityOfTextView(View.GONE) } } @Override public void onPageScrollStateChanged(int state) { } }); 延伸并在视图寻呼机中使用的自定义片段。 (您在适配器的Support.Fragment方法中返回的片段。

当您在视图寻呼机中返回一个新片段并从适配器获取它以更改放入片段中的项目的可见性时,基本上您将片段实例添加到稀疏数组中。

我假设您的视图分页器片段的布局中的textview。

编辑2:

您不在ViewPager中使用片段,因此我的解决方案不适合您。您可以将ViewPager实现更改为片段,或者不是将片段保存在稀疏数组中,而是可以保留您添加到容器中的膨胀视图,而不是片段,您可以继续使用该视图。在onPageChanged方法中,您可以像我的示例一样获取视图,找到您的textview并更改其可见性。

当我有时间时,我会在这里添加代码。

答案 1 :(得分:0)

如果要从ViewPager中删除项目,则需要从PagerAdapter中删除它并调用notifyDatasetChanged(),然后再次将适配器设置为ViewPager

mAdapter.removeItem(position);
mViewPager.setAdapter(mAdapter);

您需要在适配器类中添加一个removeItem方法(或者您想删除该项目):

public class MyAdapter extends PagerAdapter {

    //...

    public void removeItem(int position) {
        if (position > -1 && position < items.size()) {
            items.remove(position);
            notifyDataSetChanged();
        }
    } 

    //...
}

这是我让ViewPager刷新并完全删除有问题的视图的唯一方法。

在删除项目并将ViewPager重新设置到该位置之前,您可以存储当前的ViewPager位置。