将视图滑动器作为列表视图行项目

9
我有一个包含20行的列表视图,我想设置一个视图分页器,将每一行作为列表视图中的一个页面。由于列表视图行中的项目可能是一个或多个,我想使用视图分页器显示列表视图行项目。
为此,我使用以下代码: 自定义布局,用于在列表视图行中显示(作为分页器项)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/inner_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="6.0dip"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:gravity="center_vertical"
        android:text="Example Value"
        android:textAppearance="?android:textAppearanceMedium" />

主列表视图自定义行项具有视图分页器

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >


         <android.support.v4.view.ViewPager
        android:id="@+id/mypager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

MyPagerAdapter Class

public class MyPagerAdapter extends PagerAdapter {

    private Context context;

    public MyPagerAdapter(Context context) {
        this.context = context;
    }

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

    @Override
    public Object instantiateItem(View container, int position) {
        LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout view = inflater.inflate(R.layout.inner_layout_file, null);
        ((ViewPager) container).addView(view, position);
        return view;
    }

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

    @Override
    public void destroyItem(View container, int position, Object object) {
        // TODO Auto-generated method stub
        ((ViewPager) container).removeView((View) object);
    }
}

List View Adapter 获取视图方法

@Override
public View getView(int position, View convertView, ViewGroup parent) {


    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.horizontal_list_item, null,false);

    MyPagerAdapter adapter = new MyPagerAdapter(context);
    ViewPager myPager = (ViewPager) convertView.findViewById(R.id.mypager);
    myPager.setAdapter(adapter);

    myPager.setCurrentItem(0);

    return convertView;
}

我没有收到任何错误提示,但是运行后渲染的视图总是空白。


我也遇到了同样的问题.. 你能告诉我你是怎么解决的吗? - Coderji
是的,我可以帮助你。请展示你遇到问题的代码。我建议你发布一个带有你的代码的问题,我会审查并回答你。 - Gaurav Arora
请看我的问题:https://dev59.com/snrZa4cB1Zd3GeqP4qDf - Coderji
我的问题有什么进展吗?!希望你能帮我解决,或者至少解决你的问题并将其标记为正确,这样我们就可以参考它。抱歉打扰你了,提前感谢。 - Coderji
5个回答

5

我曾经遇到过同样的问题,并通过在getView()方法中动态为viewpager提供id来解决它。

@Override
public View getView(int position, View convertView, ViewGroup parent) {


    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.horizontal_list_item, null,false);

    MyPagerAdapter adapter = new MyPagerAdapter(context);
    ViewPager myPager = (ViewPager) convertView.findViewById(R.id.mypager);

    **myPager.setId(position + getCount());**

    myPager.setAdapter(adapter);

    myPager.setCurrentItem(0);

    return convertView;
}

希望这可以帮助您。


非常感谢!我在这个问题上卡了一个月,解决方案如此简单而又愚蠢... 我仍然不理解。 - francisco_ssb
当我尝试使用此方法与视图持有者时,出现异常“无法找到资源ID”。 - francisco_ssb
这个可以运行。但是当我向下滚动再向上滚动时,viewpager就会变成黑色(它在物理上依然占据着空间,但除此之外一片空白)。 - Zen

3
我遇到了同样的问题。 只需给viewpager和如果需要的话,您的列表视图行布局的主容器设置高度。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="40dip"
    android:orientation="horizontal" >


         <android.support.v4.view.ViewPager
        android:id="@+id/mypager"
        android:layout_width="match_parent"
        android:layout_height="40dip" />

</RelativeLayout>

高度必须通过固定值进行设置。如果您想使它动态化,可以尝试在运行时通过编码进行设置。


2

我创建了一个示例应用程序

带有片段的ViewPager示例: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager.zip

但是它有一个很大的缺点。所有单元格都存储在内存中,当您有很多单元格时,该应用程序可能会因低内存而崩溃。

编辑:

经过实证发现。如果在ViewPager中使用简单视图而不是片段。 我可以正确编写适配器,并且不会受到内存影响

带有视图的ViewPager示例: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager_v2.zip

我希望有人能够帮助


0

将 instantiateItem() 中的行更改为:

((ViewPager) container).addView(view, position);

to:

((ViewPager) container).addView(view, 0);

-3
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder viewHolder;


        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.listview_row, parent, false);
        CustomeListModel customeListModel = arrayList.get(position);
        Utils.d("debug", "in get view method ");

        MyPagerAdapter adapter = new MyPagerAdapter(context, customeListModel);
        viewHolder=new ViewHolder();

        viewHolder.viewPager= (ViewPager) convertView.findViewById(R.id.mypager);
        viewHolder.viewPager.setId(position + getCount());
        viewHolder.viewPager.setAdapter(adapter);
    viewHolder.viewPager.setMinimumWidth(100);
    viewHolder.viewPager.setCurrentItem(1);

    viewHolder.viewPager.setPageMargin(-380);

    convertView.setTag(viewHolder);

    return convertView;
}

从构造函数中捕获的上下文 - yogeshwar Suvarnkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接