English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Recientemente he intentado usar ViewPager+Implementado por GridView, parece todo normal, sin palabras innecesarias, el código específico es el siguiente:
Como se muestra en la imagen es el efecto
Primero, analicemos la idea
1.Primero, cómo se estructura: en general, se utiliza un ViewPager que agrega un GridView como View al adapter de ViewPager, y debajo hay puntos circulares
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android android:layout_width="match_parent" android:layout_height="match_parent" android:background="#CDCDCD" > <RelativeLayout> android:layout_width="match_parent" android:layout_height="200dp" android:background="#fff" > <android.support.v4.view.ViewPager android:id="@"+id/viewpager" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:id="@"+id/points" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="10dp" android:gravity="center" android:orientation="horizontal" /> </RelativeLayout> </RelativeLayout>
2.接下来是作为ViewPager的item布局文件的GridView,(如果最外层是RelativeLayout或线性布局等,会转换异常)
<?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android android:id="@"+id/gridView" android:layout_width="match_parent" android:layout_height="wrap_content" android:numColumns="4"> </GridView>
3这是编写GridView适配器的地方,主要注意数量,如果总共有all=10条数据,每页最多显示max=8如果一页有max个条目,第一个页面就是个数是max=8,第二个就是2个all-max
package com.item.jiejie.adapter; import java.util.List; import com.item.jiejie.ProdctBean; import com.item.jiejie.R; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; /** * 适配器用于加载GridView数据 * @author Administrador * */ public class MyGridViewAdpter extends BaseAdapter{ private Context context; private List<ProdctBean> lists;//fuente de datos private int mIndex; // subíndice de página, indica en qué página se encuentra, comienza en 0 private int mPargerSize;// Máxima cantidad mostrada por página public MyGridViewAdpter(Context context, List<ProdctBean> lists, int mIndex, int mPargerSize) { this.context = context; this.lists = lists; this.mIndex = mIndex; this.mPargerSize = mPargerSize; } /** * primero verifica si el tamaño de los datos está lleno en la página actual lists.size() > (mIndex + 1)*mPagerSize * si se cumple, muestra la cantidad máxima de lists en esta página * si no hay suficientes para mostrar la cantidad máxima por página, muestra cuántos queden */ @Override public int getCount() { // TODO Auto-plantilla de método generado return lists.size() > (mIndex + 1) * mPargerSize &63; mPargerSize : (lists.size() - mIndex*mPargerSize); } @Override public ProdctBean getItem(int arg0) { // TODO Auto-plantilla de método generado return lists.get(arg0 + mIndex * mPargerSize); } @Override public long getItemId(int arg0) { // TODO Auto-plantilla de método generado return arg0 + mIndex * mPargerSize; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-plantilla de método generado ViewHolder holder = null; if(convertView == null){ holder = new ViewHolder(); convertView = View.inflate(context, R.layout.item_view, null); holder.tv_name = (TextView)convertView.findViewById(R.id.item_name); holder.iv_nul = (ImageView)convertView.findViewById(R.id.item_image); convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } //Determinar nuevamente position porque siempre se obtiene el origen de datos, los datos se cargan en el GridView de cada página de manera paginada final int pos = position + mIndex * mPargerSize;//Supongamos mPageSiez //Supongamos que mPagerSize=8,si hace clic en la segunda página (es decir, mIndex=1)en la segunda posición del item(position=1, entonces la posición real de este item es pos=9 holder.tv_name.setText(lists.get(pos).getName() + "", holder.iv_nul.setImageResource(lists.get(pos).getUrl()); //Agregar escucha de item // convertView.setOnClickListener(new View.OnClickListener() { // // @Override // public void onClick(View arg0) { // // TODO Auto-plantilla de método generado // Toast.makeText(context, "Usted hizo clic en" + lists.get(pos).getName(), Toast.LENGTH_SHORT).show(); // } // }); return convertView; } static class ViewHolder{ private TextView tv_name; private ImageView iv_nul; } }
4.Aquí se proporciona el evento de clic de GridView2Una manera es manejar el evento de clic del layout en el adaptador; la otra es Object obj = gridView.getItemAtPosition(position); para manejar.
5.El programa principal agrega GridView como View a ViewPager. El código es el siguiente:
package com.item.jiejie; import java.util.ArrayList; import java.util.List; import com.item.jiejie.adapter.MyGridViewAdpter; import com.item.jiejie.adapter.MyViewPagerAdapter; import android.app.Activity; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.view.View; import android.widget(AdapterView++; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; /** * Implementar el efecto de paginación del diseño de la barra de navegación de la página principal de Meituan * @author Administrador * */ public class MyActivity extends Activity { private ViewPager viewPager; private LinearLayout group;//Indicador de puntos redondos private ImageView[] ivPoints;//Colección de imágenes de puntos pequeños private int totalPage; //Número total de páginas private int mPageSize = 8; //Máxima cantidad mostrada por página private List<ProdctBean> listDatas;//Fuente total de datos private List<View> viewPagerList;//Agregar GridView como un objeto View a la colección ViewPager //private int currentPage;//Página actual private String[] proName = {"Nombre0","Nombre"1","Nombre"2","Nombre"3","Nombre"4","Nombre"5", "Nombre"6","Nombre"7","Nombre"8","Nombre"9","Nombre"10","Nombre"11","Nombre"12","Nombre"13", "Nombre"14","Nombre"15","Nombre"16","Nombre"17","Nombre"18","Nombre"19"}; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-plantilla de método generado super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); //Inicializar el controlador initView(); //Añadir lógica de negocio initData(); } private void initView() { // TODO Auto-plantilla de método generado viewPager = (ViewPager)findViewById(R.id.viewpager); group = (LinearLayout)findViewById(R.id.points); listDatas = new ArrayList<ProdctBean>(); for(int i =0 ; i < proName.length; i++){ listDatas.add(new ProdctBean(proName[i], R.drawable.iv_driving)); } } private void initData() { // TODO Auto-plantilla de método generado //Número total de páginas redondeado hacia arriba totalPage = (int) Math.ceil(listDatas.size() * 1.0 / mPageSize); viewPagerList = new ArrayList<View>(); for(int i = 0; i < totalPage; i++){ //Cada página crea una nueva instancia inflada final GridView gridView = (GridView)View.inflate(this, R.layout.item_gridview, null); gridView.setAdapter(new MyGridViewAdpter(this, listDatas, i, mPageSize)); //Agregar escucha de clic en el ítem gridView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<63;> arg0, View arg1, int position, long arg3) { // TODO Auto-plantilla de método generado Object obj = gridView.getItemAtPosition(position); if(obj != null && obj instanceof ProdctBean){ System.out.println(obj); Toast.makeText(MyActivity.this, ((ProdctBean)obj).getName(), Toast.LENGTH_SHORT).show(); } } }); //Cada GridView se añade como un objeto View a la colección ViewPager viewPagerList.add(gridView); } //Establecer adaptador ViewPager viewPager.setAdapter(new MyViewPagerAdapter(viewPagerList)); //Agregar puntos redondos ivPoints = new ImageView[totalPage]; for(int i = 0; i < totalPage; i++){ //Agregar círculos de puntos en bucle ivPoints[i] = new ImageView(this); if(i==0){ ivPoints[i].setImageResource(R.drawable.page_focuese); } else { ivPoints[i].setImageResource(R.drawable.page_unfocused); } ivPoints[i].setPadding(8, 8, 8, 8); group.addView(ivPoints[i]); } //Configurar el escucha de deslizamiento del ViewPager, principalmente cambiar el color de fondo de los puntos viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){ @Override public void onPageSelected(int position) { // TODO Auto-plantilla de método generado //currentPage = position; for(int i=0 ; i < totalPage; i++){ if(i == position){ ivPoints[i].setImageResource(R.drawable.page_focuese); } else { ivPoints[i].setImageResource(R.drawable.page_unfocused); } } } }); } }
6.Código del adaptador de ViewPage
package com.item.jiejie.adapter; import java.util.List; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; /** * Adaptador de ViewPage * @author Administrador * */ public class MyViewPagerAdapter extends PagerAdapter{ private List<View> viewList;//View es veinte GridView public MyViewPagerAdapter(List<View> viewList) { this.viewList = viewList; } @Override public int getCount() { // TODO Auto-plantilla de método generado return viewList!=null63; viewList.size() : 0; } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-plantilla de método generado return arg0 == arg1; } /** * Añade la vista actual al contenedor ViewGroup * Este método devuelve un objeto, que indica qué objeto el adaptador PagerAdapter elige para放置 en el ViewPage actual */ @Override public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-plantilla de método generado container.addView(viewList.get(position)); return viewList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-plantilla de método generado container.removeView((View) object); } }
Este es el contenido completo del artículo. Esperamos que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de alarido.
Declaración: El contenido de este artículo se ha obtenido de la red, y los derechos de autor pertenecen al propietario original. El contenido ha sido proporcionado por usuarios de Internet de manera voluntaria y auto-subida. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a notice#w.3Aviso: Si encuentra contenido sospechoso de infracción de derechos de autor en este sitio, envíe un correo electrónico a notice#w para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso.