Android實(shí)現(xiàn)圖片輪播列表
這個(gè)效果在交友a(bǔ)pp中比較常見(jiàn),一般作為首頁(yè)使用,頂部是一個(gè)自動(dòng)輪播的ViewPager,下面放一個(gè)橫向LinearLayout,最下面要放一個(gè)ListView,但是注意這三個(gè)部分都支持滑動(dòng),應(yīng)該和固定在頂部的標(biāo)題欄和底部的操作欄分開(kāi),也就是把ViewPager和LinearLayout以及ListView都放在父控件ScrollView里面
布局文件代碼:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/title_bar"/> <ScrollView android:layout_width="match_parent" android:id="@+id/sv" android:layout_height="0dp" android:layout_weight="1"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="200dp"/> <LinearLayout android:id="@+id/ivs" android:layout_width="match_parent" android:layout_height="60dp" android:layout_margin="10dp" android:orientation="horizontal"> <ImageView android:id="@+id/iv1" android:layout_weight="1" android:layout_marginStart="30dp" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/index_icon"/> <ImageView android:id="@+id/iv2" android:layout_weight="1" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/index_icon"/> <ImageView android:id="@+id/iv3" android:layout_weight="1" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/index_icon"/> <ImageView android:id="@+id/iv4" android:layout_weight="1" android:layout_marginEnd="30dp" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/index_icon"/> </LinearLayout> <com.oridway.www.uiframe.utils.ListViewForScrollView android:id="@+id/lvfsv" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> </ScrollView> <LinearLayout android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="horizontal"> <TextView android:id="@+id/index" android:layout_width="60dp" android:layout_height="wrap_content" android:drawableTop="@drawable/ic_home_black_24dp" android:gravity="center" android:text="首頁(yè)" android:textColor="@color/black" /> <TextView android:id="@+id/message" android:layout_width="60dp" android:layout_height="wrap_content" android:drawableTop="@drawable/ic_message_black_24dp" android:gravity="center" android:text="消息" android:textColor="@color/black" /> <TextView android:id="@+id/community" android:layout_width="60dp" android:layout_height="wrap_content" android:drawableTop="@drawable/ic_people_black_24dp" android:gravity="center" android:text="社區(qū)" android:textColor="@color/black" /> <TextView android:id="@+id/self" android:layout_width="60dp" android:layout_height="wrap_content" android:drawableTop="@drawable/ic_person_black_24dp" android:gravity="center" android:text="我" android:textColor="@color/black" /> </LinearLayout> </LinearLayout>
主窗口代碼:
public class IndexActivity extends AppCompatActivity implements View.OnClickListener{ private Context mContext; private List<Integer> mImageList; private List<Candidate> mCandidateList; private ViewPagerAdapter mPagerAdapter; private CandidateListAdapter mListAdapter; @SuppressLint("HandlerLeak") private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { //每次將當(dāng)前的位置加1,也就是向右滑動(dòng)一次 vp.setCurrentItem(vp.getCurrentItem() + 1); //遞歸無(wú)限循環(huán)調(diào)用 handler.sendEmptyMessageDelayed(0x123, 2000); } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_index); ButterKnife.bind(this); initData(); initView(); intListener(); } //初始化數(shù)據(jù)源,固定寫(xiě)法 1.實(shí)例化容器 2.實(shí)例化適配器 3.設(shè)置適配器 private void initData() { mContext = this; mImageList = new ArrayList<>(); mCandidateList = new ArrayList<>(); mListAdapter = new CandidateListAdapter(mCandidateList); mPagerAdapter = new ViewPagerAdapter(mImageList); lvfsv.setAdapter(mListAdapter); vp.setAdapter(mPagerAdapter); getListData(10); getPagerData(); //間隔2秒發(fā)送一次信息 handler.sendEmptyMessageDelayed(0x123, 2000); } //生成ViewPager數(shù)據(jù)源 private void getPagerData() { mImageList.add(R.drawable.bm1); mImageList.add(R.drawable.bm2); mImageList.add(R.drawable.bm3); mImageList.add(R.drawable.bm4); mImageList.add(R.drawable.bm5); mImageList.add(R.drawable.bm6); mPagerAdapter.notifyDataSetChanged(); //初始的位置在正中間 vp.setCurrentItem(mPagerAdapter.getCount() / 2); } //生成ListView數(shù)據(jù)源 private void getListData(int num) { for (int i = 0; i < num; i++) { Candidate candidate = new Candidate(); candidate.setName("姓名:尼爾斯·亨利克·戴維·玻爾"); candidate.setInfo("職業(yè):學(xué)者,物理學(xué)家,足球運(yùn)動(dòng)員"); candidate.setTrait("成就:哥本哈根學(xué)派的創(chuàng)始人,1922年獲得諾貝爾物理學(xué)獎(jiǎng)"); mCandidateList.add(candidate); } mListAdapter.notifyDataSetChanged(); } private void initView() { tvTitleMiddle.setText("輪播列表"); //手動(dòng)設(shè)置ScrollView的位置 scrollView.smoothScrollTo(0, 0); } //初始化監(jiān)聽(tīng) private void intListener() { mPagerAdapter.setmCallback((v, position) -> { Toast.makeText(mContext, "position: " + position, Toast.LENGTH_SHORT).show(); }); lvfsv.setOnItemClickListener((parent, view, position, id) -> { Toast.makeText(mContext, "position: " + position, Toast.LENGTH_SHORT).show(); }); for (int i = 0; i < 4; i++) { ivs.getChildAt(i).setOnClickListener(this); } } @Override public void onClick(View v) { switch (v.getId()){ case R.id.iv1: case R.id.iv2: case R.id.iv3: case R.id.iv4: Toast.makeText(mContext, "此處跳轉(zhuǎn)", Toast.LENGTH_SHORT).show(); } } }
ListView需要覆蓋onMeasure方法,代碼如下:
public class ListViewForScrollView extends ListView { public ListViewForScrollView(Context context) { super(context); } public ListViewForScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public ListViewForScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override /** * 重寫(xiě)該方法,達(dá)到使ListView適應(yīng)ScrollView的效果 */ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
ViewPager適配器代碼:
public class ViewPagerAdapter extends PagerAdapter implements View.OnClickListener { //圖片的資源id列表 private List<Integer> mList; private Callback mCallback; public ViewPagerAdapter(List<Integer> mList) { this.mList = mList; } public void setmCallback(Callback mCallback) { this.mCallback = mCallback; } public interface Callback { void onClick(View v, int position); } @Override //將適配器中的數(shù)據(jù)設(shè)為無(wú)窮大 public int getCount() { return Integer.MAX_VALUE; } @Override //固定寫(xiě)法,不覆蓋會(huì)報(bào)錯(cuò) public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); } @Override //固定寫(xiě)法 public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { LayoutInflater inflater = LayoutInflater.from(container.getContext()); ImageView imageView = (ImageView) inflater.inflate(R.layout.item_image_pager, null); //將position轉(zhuǎn)換成余數(shù) int realPosition = position % mList.size(); imageView.setImageResource(mList.get(realPosition)); imageView.setOnClickListener(this); //tag放跳轉(zhuǎn)需要的數(shù)據(jù) imageView.setTag(realPosition); //將實(shí)例加入父控件 container.addView(imageView); return imageView; } @Override //使用接口將position回傳 public void onClick(View v) { mCallback.onClick(v, (int) v.getTag()); } }
大功告成,實(shí)現(xiàn)效果如下:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android基于AdapterViewFlipper實(shí)現(xiàn)的圖片/文字輪播動(dòng)畫(huà)控件
- Android實(shí)現(xiàn)背景圖片輪播
- Android輪播圖點(diǎn)擊圖片放大效果的實(shí)現(xiàn)方法
- 詳解android 視頻圖片混合輪播實(shí)現(xiàn)
- Android開(kāi)發(fā)實(shí)現(xiàn)的自動(dòng)換圖片、輪播圖效果示例
- Android實(shí)現(xiàn)輪播圖片展示效果
- Android自定義圖片輪播Banner控件使用解析
- Android高級(jí)圖片滾動(dòng)控件實(shí)現(xiàn)3D版圖片輪播器
- Android開(kāi)發(fā)使用Handler的PostDelayed方法實(shí)現(xiàn)圖片輪播功能
- 用AdapterViewFlipper輕松完成圖片輪播
相關(guān)文章
在Linux下通過(guò)命令行打包Android應(yīng)用的方法
這篇文章主要介紹了在Linux下通過(guò)命令行打包Android應(yīng)用的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Android?Room數(shù)據(jù)庫(kù)加密詳解
這篇文章主要為大家詳細(xì)介紹了Android?Room數(shù)據(jù)庫(kù)加密,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01詳談Matrix中preTranslate()和postTranslate()的理解
這篇文章主要為大家詳細(xì)介紹了Matrix中preTranslate()和postTranslate()的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Android?Material組件庫(kù)日期選擇和時(shí)間選擇器的使用方法
這篇文章主要介紹了Android?Material組件庫(kù)(日期選擇和時(shí)間選擇器)基本使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11Android使用CrashHandler來(lái)獲取應(yīng)用的crash信息的方法
本篇文章主要介紹了Android使用CrashHandler來(lái)獲取應(yīng)用的crash信息的方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09Android仿京東淘寶自動(dòng)無(wú)限循環(huán)輪播控件思路詳解
在App的開(kāi)發(fā)中,很多的時(shí)候都需要實(shí)現(xiàn)類(lèi)似京東淘寶一樣的自動(dòng)無(wú)限輪播的廣告欄,這里小編寫(xiě)了一個(gè),分享到腳本之家平臺(tái)供大家參考2017-04-04利用Android中BitmapShader制作自帶邊框的圓形頭像
這篇文章給大家介紹了一下如何利用BitmapShader制作圓形頭像,可以自定義要顯示的圖片,邊框顏色和邊框?qū)挾鹊龋行枰呐笥褌兛梢詤⒖冀梃b。2016-09-09使用SharedPreferences在Android存儲(chǔ)對(duì)象詳細(xì)代碼
這篇文章主要介紹了使用SharedPreferences在Android存儲(chǔ)對(duì)象并附上詳細(xì)代碼,下面文章內(nèi)容較少,大多以代碼的形式體現(xiàn),需要的小伙伴可以參考一下,希望對(duì)你有所幫助2021-11-11