Android實現(xiàn)圖片輪播列表
這個效果在交友app中比較常見,一般作為首頁使用,頂部是一個自動輪播的ViewPager,下面放一個橫向LinearLayout,最下面要放一個ListView,但是注意這三個部分都支持滑動,應(yīng)該和固定在頂部的標(biāo)題欄和底部的操作欄分開,也就是把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="首頁"
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,也就是向右滑動一次
vp.setCurrentItem(vp.getCurrentItem() + 1);
//遞歸無限循環(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ù)源,固定寫法 1.實例化容器 2.實例化適配器 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é)家,足球運動員");
candidate.setTrait("成就:哥本哈根學(xué)派的創(chuàng)始人,1922年獲得諾貝爾物理學(xué)獎");
mCandidateList.add(candidate);
}
mListAdapter.notifyDataSetChanged();
}
private void initView() {
tvTitleMiddle.setText("輪播列表");
//手動設(shè)置ScrollView的位置
scrollView.smoothScrollTo(0, 0);
}
//初始化監(jiān)聽
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
/**
* 重寫該方法,達(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è)為無窮大
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
//固定寫法,不覆蓋會報錯
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
@Override
//固定寫法
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);
//將實例加入父控件
container.addView(imageView);
return imageView;
}
@Override
//使用接口將position回傳
public void onClick(View v) {
mCallback.onClick(v, (int) v.getTag());
}
}
大功告成,實現(xiàn)效果如下:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android基于AdapterViewFlipper實現(xiàn)的圖片/文字輪播動畫控件
- Android實現(xiàn)背景圖片輪播
- Android輪播圖點擊圖片放大效果的實現(xiàn)方法
- 詳解android 視頻圖片混合輪播實現(xiàn)
- Android開發(fā)實現(xiàn)的自動換圖片、輪播圖效果示例
- Android實現(xiàn)輪播圖片展示效果
- Android自定義圖片輪播Banner控件使用解析
- Android高級圖片滾動控件實現(xiàn)3D版圖片輪播器
- Android開發(fā)使用Handler的PostDelayed方法實現(xiàn)圖片輪播功能
- 用AdapterViewFlipper輕松完成圖片輪播
相關(guān)文章
在Linux下通過命令行打包Android應(yīng)用的方法
這篇文章主要介紹了在Linux下通過命令行打包Android應(yīng)用的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
詳談Matrix中preTranslate()和postTranslate()的理解
這篇文章主要為大家詳細(xì)介紹了Matrix中preTranslate()和postTranslate()的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
Android?Material組件庫日期選擇和時間選擇器的使用方法
這篇文章主要介紹了Android?Material組件庫(日期選擇和時間選擇器)基本使用,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11
Android使用CrashHandler來獲取應(yīng)用的crash信息的方法
本篇文章主要介紹了Android使用CrashHandler來獲取應(yīng)用的crash信息的方法,具有一定的參考價值,有興趣的可以了解一下2017-09-09
Android仿京東淘寶自動無限循環(huán)輪播控件思路詳解
在App的開發(fā)中,很多的時候都需要實現(xiàn)類似京東淘寶一樣的自動無限輪播的廣告欄,這里小編寫了一個,分享到腳本之家平臺供大家參考2017-04-04
利用Android中BitmapShader制作自帶邊框的圓形頭像
這篇文章給大家介紹了一下如何利用BitmapShader制作圓形頭像,可以自定義要顯示的圖片,邊框顏色和邊框?qū)挾鹊?,有需要的朋友們可以參考借鑒。2016-09-09
使用SharedPreferences在Android存儲對象詳細(xì)代碼
這篇文章主要介紹了使用SharedPreferences在Android存儲對象并附上詳細(xì)代碼,下面文章內(nèi)容較少,大多以代碼的形式體現(xiàn),需要的小伙伴可以參考一下,希望對你有所幫助2021-11-11

