ListView中嵌套ViewPager(ViewPager是item的一部分),并且存在判断位置的小白点。

============问题描述============

被bug困扰了好久:

1.白点会出现混乱,有的时候是正常的,有的时候会不动(如果界面只有一个item,白点可以正常切换,有两个item就会不动)。

2.当有两个item时,如果滑动上一个item图片与下一个item一样时,下面的item的图片就会消失。

本人新手,贴上代码,求各位大神指导。

package com.glasses.adapter;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.apache.http.Header;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import android.content.Context;

import android.content.Intent;

import android.os.Message;

import android.support.v4.view.PagerAdapter;

import android.support.v4.view.ViewPager;

import android.support.v4.view.ViewPager.OnPageChangeListener;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.view.ViewGroup.LayoutParams;

import android.widget.BaseAdapter;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.Toast;

import com.example.activity.R;

import com.glasses.activity.TryActivity;

import com.glasses.utils.MyViewPager;

import com.glasses.utils.NetWorkUtil;

import com.loopj.android.http.AsyncHttpClient;

import com.loopj.android.http.JsonHttpResponseHandler;

import com.loopj.android.http.RequestParams;

public class GoodsAdapter extends BaseAdapter {

	/**

	 * ViewPager

	 */

	private MyViewPager viewPager;

	/**

	 * 装点点的ImageView数组

	 */

	private ImageView[] tips;

	/**

	 * 装ImageView数组

	 */

	private ImageView[] mImageViews;

	//存放图片的集合

	private List<ImageView> listImg;

	/**

	 * 图片资源id

	 */

	private int[] imgIdArray;

	// 上下文

	private Context context;

	private LayoutInflater inflater;

	private Button try_glasses;

	private ImageView collect;

	public GoodsAdapter(Context context) {

		// TODO Auto-generated constructor stub

		this.context = context;

		this.inflater = LayoutInflater.from(context);

	}

	@Override

	public int getCount() {

		// TODO Auto-generated method stub

		return 6;

	}

	@Override

	public Object getItem(int position) {

		// TODO Auto-generated method stub

		return position;

	}

	@Override

	public long getItemId(int position) {

		// TODO Auto-generated method stub

		return position;

	}

	@Override

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

		View view = inflater.inflate(R.layout.item_goods, null);

		//放置白点的LinearLayout区域

		LinearLayout group = (LinearLayout) view.findViewById(R.id.viewGroup);

		//获取viewPager控件

		viewPager = (MyViewPager) view.findViewById(R.id.viewPager);

		// 载入图片资源ID

		imgIdArray = new int[] { R.drawable.a, R.drawable.b, R.drawable.c,

				R.drawable.d, R.drawable.e };

		// 将白点加入到LinearLayout中

		tips = new ImageView[imgIdArray.length];

		for (int i = 0; i < tips.length; i++) {

			ImageView imageView = new ImageView(context);

			imageView.setLayoutParams(new LayoutParams(10, 10));

			tips[i] = imageView;

			if (i == 0) {

				tips[i].setBackgroundResource(R.drawable.page_indicator_focused);

			} else {

				tips[i].setBackgroundResource(R.drawable.page_indicator_unfocused);

			}

			group.addView(imageView);

		}

		//初始化图片集合

		listImg = new ArrayList<ImageView>();

		// 将图片装载到数组中

		mImageViews = new ImageView[imgIdArray.length];

		for (int i = 0; i < mImageViews.length; i++) {

			ImageView imageView = new ImageView(context);

			imageView.setBackgroundResource(imgIdArray[i]);

			// imageView.setImageResource(imgIdArray[i]);

			mImageViews[i] = imageView;

			listImg.add(imageView);

		}

		//适配器设置

		viewPager.setAdapter(new MyAdapter());

		viewPager.setOnPageChangeListener(new OnPageChangeListener() {

			//滑动完成调用

			@Override

			public void onPageSelected(int arg0) {

				// TODO Auto-generated method stub

				Log.i("Glasses", "1111111");

				setImageBackground(arg0 % mImageViews.length);

			}

			@Override

			public void onPageScrolled(int arg0, float arg1, int arg2) {

				// TODO Auto-generated method stub

			}

			/**

			 * 设置选中的白点的背景变色

			 * 

			 * @param selectItems

			 */

			private void setImageBackground(int selectItems) {

				for (int i = 0; i < tips.length; i++) {

					if (i == selectItems) {

						tips[i].setBackgroundResource(R.drawable.page_indicator_focused);

					} else {

						tips[i].setBackgroundResource(R.drawable.page_indicator_unfocused);

					}

				}

			}

			@Override

			public void onPageScrollStateChanged(int arg0) {

				// TODO Auto-generated method stub

			}

		});

		//设置viewPager的起始位置

		viewPager.setCurrentItem(0);

		return view;

	}

	public class MyAdapter extends PagerAdapter {

		@Override

		public int getCount() {

			return listImg.size();

		}

		@Override

		public boolean isViewFromObject(View arg0, Object arg1) {

			return arg0 == arg1;

		}

		@Override

		public void destroyItem(View container, int position, Object object) {

			((ViewPager) container).removeView(listImg.get(position));

		}

		/**

		 * 载入图片进去,用当前的position 除以 图片数组长度取余数是关键

		 */

		@Override

		public Object instantiateItem(View container, int position) {

			ViewGroup group = (ViewGroup) listImg.get(position % listImg.size()).getParent();

			//判断是否存在图片,如果存在先移除,后添加

			if (group != null) {

				group.removeView(listImg.get(position));

			}

			((ViewPager) container).addView(listImg.get(position % listImg.size()));

			return listImg.get(position % listImg.size());

		}

	}

}

============解决方案1============

我能想象到你的需求,但是这样listView更新时需要加载的东西太多了,建议将图片的显示放在listView item的点击事件里面。

============解决方案2============

这需求太生猛了,listView每个Item建立一个viewPager.......,逻辑太复杂。

建议考虑更改交互方案.

如果方案不能改动的话,建议不用listview,需要几个PageView就用代码创建几个,通过addView加到主窗体中,这样逻辑好控制一些

============解决方案3============

引用 4 楼 Crazy9599 的回复:

Quote: 引用 2 楼 lionfresh 的回复:

我能想象到你的需求,但是这样listView更新时需要加载的东西太多了,建议将图片的显示放在listView item的点击事件里面。

==需求貌似很难改,这样实现不了么?不知道是不是代码的问题。

那就优化下代码,ListView的item显示一个简介,点击item弹出一个popupwindow,在popupwindow中显示你的图片什么的。

时间: 2024-10-14 20:20:34

ListView中嵌套ViewPager(ViewPager是item的一部分),并且存在判断位置的小白点。的相关文章

(ViewPager+Fragment)动态加载、删除页面,Fragmen中嵌套使用ViewPager

1.(ViewPager+Fragment)动态加载.删除页面 a.首先adapter要继承FragmentStatePagerAdapter. b.在PagerAdatpar重写getItemPosition(),return POSITION_NONE 即可每次刷新加载图面. 2.Fragmen中嵌套使用ViewPager 和activity中一样使用,将传入的getSupportFragmentManager替换成getChildFragmentManager即可.

解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题

在一个滑动控件或者是布局里面,添加另外一个可以滑动的控件,通常会造成一些莫名其妙的问题.今天主要介绍在工作中遇到的,在ScrollView布局中嵌套Listview显示不正常,和在Listview中嵌套Listview的滑动冲突的问题. 1.ScrollView布局中嵌套Listview显示不正常的解决方案 目前来说,解决这个问题有好几种解决方案,这里只介绍其中两种比较简单易行的其中两种. (1)自定义一个Listview,继承自Listview,代码如下: public class ListV

Android如何在ListView中嵌套ListView

前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题.上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计算的. 又搜索了一下,发现有StackOverflow上的牛人已经解决了这个问题,经过

Android 在ListView中嵌套ListView的事件处理

前天在工作中遇到在ListView中的Item需要用ListView来展现处理后的内容,然后就遇到了一个很头疼的问题,作为Item的ListView没法进行滑动,而且显示也不正常,只是显示几个子Item.不能将子Item全部显示,原因是在控件绘制出来之前要对ListView的大小进行计算,要解决将子ListView全部显示出来的问题,就是重新计算一下其大小告知系统即可.后面这个问题比较好解决,网上已经给出解决方案: 前辈们给出了一个方法,重新计算子ListView的大小,然后在设置本ListVi

ListView中嵌套GridView显示不全的解决方法

项目需要,在ListView中显示多张图片,用到了GridView,不过如果使用普通的GridView,Item仅仅只是显示一部分,超出第一行以后的都无法显示了,这个很无语,所以又得继承下GridView重写onMeasure方法去测量子控件的宽高了.. 这里只是贴出自定义GridView的代码,直接在xml中使用,ListView的Adapter中调用即可: public class GridViewForListView extends GridView { public GridViewF

我的Android进阶之旅------&gt;Android中ListView中嵌套(ListView)控件时item的点击事件不起作的问题解决方法

开发中常常需要自己定义Listview,去继承BaseAdapter,在adapter中按照需求进行编写,问题就出现了,可能会发生点击每一个item的时候没有反应,无法获取的焦点. 如果你的自定义ListViewItem中有Button.ImageButton或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus.所以常常当点击item时变化的是子控件,item本身的点击没有响应. 这时候就可以使用descendan

我的Android进阶之旅------&amp;gt;Android中ListView中嵌套(ListView)控件时item的点击事件不起作的问题解决方法

开发中经常须要自定义Listview,去继承BaseAdapter,在adapter中依照需求进行编写,问题就出现了,可能会发生点击每个item的时候没有反应,无法获取的焦点. 假设你的自己定义ListViewItem中有Button.ImageButton或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus. 所以经常当点击item时变化的是子控件,item本身的点击没有响应. 这时候就能够使用descendan

ListView 中嵌套 GridView

1.主布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" andro

ListView中嵌套GridView时GridView的数据无法完全显示,只显示一行

这种情况下需要自定义一个GridView,然后重写GridView的onMeasure(int widthMeasureSpec, int heightMeasureSpec)的方法,将GridView重新测量,并且指定GridView的新的高度 package com.yuedong.mobi.view; import android.content.Context; import android.util.AttributeSet; import android.widget.GridVie