我有一个包含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类
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);
}
}
列表视图适配器获取视图方法
@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;
}
我没有收到错误,运行后呈现的视图总是空的。
答案 0 :(得分: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;
}
希望这可以帮助你。
答案 1 :(得分: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 :(得分:2)
我创建了示例应用
带片段的示例ViewPager : https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager.zip
但是有一个很大的缺点。所有单元都存储在内存中,无论你有多少单元格,应用程序都会因内存不足而崩溃
修改强>
根据经验,它已被发现。如果只是在 ViewPager 中使用视图而不是片段。 我可以正确编写适配器而不会被内存打击
带有视图的示例ViewPager: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager_v2.zip
我希望有人可以提供帮助
答案 3 :(得分:0)
从以下位置更改instantiateItem()中的行:
((ViewPager) container).addView(view, position);
为:
((ViewPager) container).addView(view, 0);
答案 4 :(得分:-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;
}