English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

استخدام ViewPager + GridView لتحقيق تأثير التصفح في لوحة التوجيه الرئيسية في Android

最近我尝试使用ViewPager+GridView实现的,看起来一切正常,废话不多说,具体代码如下:

如图是效果图

 

首先分析下思路

1.首先是怎么布局:整体是一个ViewPager将GridView作为一个View添加到ViewPager的adapter中,下方是圆点

<?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=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 Administrator
 *
 */
public class MyGridViewAdpter extends BaseAdapter{
  private Context السياق;
  private List<ProdctBean> القائمة; // مصدر البيانات
  private int معامل_الصف; // مؤشر الصفحة، يشير إلى الصفحة التي يتم عرضها، تبدأ من 0
  private int حجم_القطعة; // أقصى عدد الصفحات التي يتم عرضها في كل صفحة
  public MyGridViewAdpter(السياق السياق, List<ProdctBean> القائمة,
      int معامل_الصف, int حجم_القطعة) {
    هذا.السياق = السياق;
    هذا.القائمة = القائمة;
    هذا.معامل_الصف = معامل_الصف;
    هذا.حجم_القطعة = حجم_القطعة;
  }
  /**
   * أولاً، قم بتحديد ما إذا كان حجم البيانات أكبر من حجم الصفحة lists.size() > (معامل_الصف + 1)* حجم_الصفحة
   * إذا كان هناك ما يكفي، فإن الصفحة ستعرض أقصى عدد الصفحات من قائمة lists
   * إذا لم يكن هناك ما يكفي لعرض أقصى عدد الصفحات، فإن العدد المتبقي سيتم عرضه
   */
  @Override
  public int getCount() {
    // TODO Auto-generated method stub
    هل حجم_القائمة > (معامل_الصف + 1) * حجم_القطعة ? 
        حجم_القطعة : (حجم_القائمة - معامل_القطعة * حجم_القطعة);
  }
  @Override
  public ProdctBean getItem(int arg0) {
    // TODO Auto-generated method stub
    return lists.get(arg0 + mIndex * mPargerSize);
  }
  @Override
  public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return arg0 + mIndex * mPargerSize;
  }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    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();
    }
    //تحديد position مرة أخرى لأننا نحصل دائمًا على المصدر البيانات، والمصدر البيانات يتم تحميله على شكل صفحات إلى Gridview لكل صفحة
    final int pos = position + mIndex * mPargerSize;//افتراض mPageSiez
    //افتراض mPagerSize=8، إذا كان النقر على الصفحة الثانية (i.e. mIndex=1) في الموضع الثاني item(position=1)، فإن موقع هذا العنصر الفعلي سيكون pos=9
    holder.tv_name.setText(lists.get(pos).getName() + "");
    holder.iv_nul.setImageResource(lists.get(pos).getUrl());
    //إضافة استماع إلى عنصر item
//    convertView.setOnClickListener(new View.OnClickListener() {
//}}      
//      @Override
//      public void onClick(View arg0) {
//        // TODO Auto-generated method stub
//        Toast.makeText(context, "أنت قد نقرت" + lists.get(pos).getName(), Toast.LENGTH_SHORT).show();
//      }
//    });
    return convertView;
  }
  static class ViewHolder{
    private TextView tv_name;
    private ImageView iv_nul;
  }
}

4. في هذا القسم، يتم تقديم طريقتين للتعامل مع أحداث النقر على GridView: الطريقة الأولى هي استخدام أحداث النقر في التكيفر (Adapter) باستخدام التخطيط، والطريقة الثانية هي باستخدام Object obj = gridView.getItemAtPosition(position);

5. البرنامج الرئيسي يضيف GridView كعرض إلى ViewPager كما يلي

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;
/**
 * تحقيق تصميم شريط التصفح الرئيسي لموقع Meituan مع تأثير الصفحة التالية 
 * @author Administrator
 *
 */
public class MyActivity extends Activity {
  private ViewPager viewPager;
  private LinearLayout group;//圆点指示器
  private ImageView[] ivPoints;//小圆点图片的集合
  private int totalPage; //总的页数
  private int mPageSize = 8; //每页显示的最大的数量
  private List<ProdctBean> listDatas;//总的数据源
  private List<View> viewPagerList;//GridView作为一个View对象添加到ViewPager集合中
  //private int currentPage;//当前页
  private String[] proName = {"اسم0","اسم1","اسم2","اسم3","اسم4","اسم5",
      "اسم6","اسم7","اسم8","اسم9","اسم10","اسم11","اسم12","اسم13",
      "اسم14","اسم15","اسم16","اسم17","اسم18","اسم19"};
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    //初始化控件
    initView();
    //添加业务逻辑
    initData();
  }
  private void initView() {
    // TODO Auto-generated method stub
    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-generated method stub
    //عدد الصفحات الإجمالي يتم رفعه للأعلى
    totalPage = (int) Math.ceil(listDatas.size() * 1.0 / mPageSize);
    viewPagerList = new ArrayList<View>();
    لـ(int i = 0; i < totalPage; i++) {
      //كل صفحة هي إنشاء نموذج جديد
      final GridView gridView = (GridView)View.inflate(this, R.layout.item_gridview, null);
      gridView.setAdapter(new MyGridViewAdpter(this, listDatas, i, mPageSize));
      //إضافة استماع إلى النقر على العنصر
      gridView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1,
            int position, long arg3) {
          // TODO Auto-generated method stub
          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();
          }
        }
      });
      //كل GridView كـ View يتم إضافته إلى مجموعة ViewPager      
      viewPagerList.add(gridView);
    }
    //ضبط مزامنة ViewPager
    viewPager.setAdapter(new MyViewPagerAdapter(viewPagerList));
    //إضافة نقاط صغيرة
    ivPoints = new ImageView[totalPage];
    لـ(int i = 0; i < totalPage; i++) {
      //Loop to add dot images to the group
      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]);
    }
    //Set the ViewPager sliding listener, mainly to change the background color of the dots
    viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
      @Override
      public void onPageSelected(int position) {
        // TODO Auto-generated method stub
        //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. Code for ViewPage adapter

package com.item.jiejie.adapter;
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
/**
 * Adapter for ViewPage
 * @author Administrator
 *
 */
public class MyViewPagerAdapter extends PagerAdapter{
  private List<View> viewList;//View is a kind of GridView
  public MyViewPagerAdapter(List<View> viewList) {
    this.viewList = viewList;
  }
  @Override
  public int getCount() {
    // TODO Auto-generated method stub
    return viewList!=null ? viewList.size() : 0;
  }
  @Override
  public boolean isViewFromObject(View arg0, Object arg1) {}}
    // TODO Auto-generated method stub
    return arg0 == arg1;
  }
  /**
   * يضيف الفئة الحالية إلى وحدة ViewGroup
   * هذا النهج،يعود بفئة،والفئة تعبر عن ما إذا كان PagerAdapter الموجه يختار أي فئة لوضعها في ViewPage الحالي
   */
  @Override
  public Object instantiateItem(ViewGroup container, int position) {
    // TODO Auto-generated method stub
    container.addView(viewList.get(position));
    return viewList.get(position);
  }
  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
    // TODO Auto-generated method stub
     container.removeView((View) object);
  }
}

هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أن تدعموا دليل النقاهة بزيادة.

بيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع صاحب الحقوق الأصلية، ويتم إضافة المحتوى من قبل مستخدمي الإنترنت بشكل متعاون، ولا يمتلك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) للإبلاغ، وتقديم الدليل المتعلق، إذا تم التحقق من ذلك، فإن هذا الموقع سيزيل محتوى يشتبه في حقوق النسخ على الفور.

أعجبك