1. 程式人生 > >ListView,GridView以及RecyclerView的使用

ListView,GridView以及RecyclerView的使用

ListView以及GridView

ListView通過字面意思我們就能理解為列表佈局,GridView就是網格佈局,他們的使用就是自己編寫一個Adapter去設定每一個item的佈局,然後在裡面做各種優化就好了。最後我們把寫的這個Adapter設定進ListView或者GridView就好了。

普通Adapter

我們將資料來源傳遞進來,然後重寫方法就好了

  • getCount()獲取資料來源長度
  • getItem(int position)獲取資料來源其中一項
  • getItemId(int position)獲取資料來源id
  • getView(int position, View convertView, ViewGroup parent)獲取View,設定值
package com.gin.xjh.shin_music.adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import
android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.gin.xjh.shin_music.R; import com.gin.xjh.shin_music.bean.Album; import java.util.List; public class albumItemAdapter extends BaseAdapter { private Context mContext; private LayoutInflater mInflater; private
List<Album> mList; public albumItemAdapter(Context context,List<Album> list){ mContext = context; mList=list; mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public void setmList(List<Album> mList) { this.mList = mList; } @Override public int getCount() { return mList.size(); } @Override public Album getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = mInflater.inflate(R.layout.fragment_shin_item, null); holder = new ViewHolder(); holder.shin_Img = convertView.findViewById(R.id.shin_img); holder.shin_Text = convertView.findViewById(R.id.shin_text); //測試 Drawable drawable = mContext.getResources().getDrawable(R.drawable.dayemen); BitmapDrawable bd = (BitmapDrawable) drawable; Bitmap bitmap = bd.getBitmap(); holder.shin_Img.setImageBitmap(bitmap); holder.shin_Text.setText(mList.get(position).getAlbumName()); return convertView; } }

優化Adapter

優化方面就是利用了Tag,我們把控制元件的引用記錄在ViewHolder中,然後把ViewHolder設定到convertView上,然後當我們需要一個新的Item的時候就複用離開窗體的Item的View就好了。主要是在getView上的不同,以及我們要新建一個內部類取名為ViewHolder。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if(convertView == null){
        convertView = mInflater.inflate(R.layout.fragment_shin_item, null);
        holder = new ViewHolder();
        holder.shin_Img = convertView.findViewById(R.id.shin_img);
        holder.shin_Text = convertView.findViewById(R.id.shin_text);
        convertView.setTag(holder);
    }
    else{
        holder = (ViewHolder) convertView.getTag();
    }
    //測試
    Drawable drawable = mContext.getResources().getDrawable(R.drawable.dayemen
    BitmapDrawable bd = (BitmapDrawable) drawable;
    Bitmap bitmap = bd.getBitmap();
    holder.shin_Img.setImageBitmap(bitmap);
    holder.shin_Text.setText(mList.get(position).getAlbumName());
    return convertView;
}
public class ViewHolder {
    private TextView shin_Text;
    private ImageView shin_Img;
}

上面的兩個的使用是一樣的,都是new一個Adapter,然後設定到ListView或者GridView中去就好了,下面我們就以GridView為例子。

adapter = new albumItemAdapter(getContext(),dataList);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        Toast.makeText(getContext(),"check "+arg2,Toast.LENGTH_SHORT).show();
    }
});

SimpleAdapter

這個因為Android系統已經實現的Adapter,我們只要把資料以及資料格式設定進去就好了。

private GridView gridView;
private List<Map<String, Object>> dataList;
private SimpleAdapter adapter;

dataList = new ArrayList<>();
for (int i = 0; i <6; i++) {
    Map<String, Object> map=new HashMap<>();
    map.put("img", R.drawable.test);
    map.put("text","搖滾");
    dataList.add(map);
}
//GridView
String[] from={"img","text"};
int[] to={R.id.music_img,R.id.music_text};
adapter=new SimpleAdapter(getContext(), dataList, R.layout.online_music_item, from, to);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        Toast.makeText(getContext(),"check "+arg2,Toast.LENGTH_SHORT).show();
    }
});

我們看SimpleAdapter的原始碼就可以發現其實他裡面是實現了對於View的複用的,但是沒有實現View中控制元件ID的繫結的。
這裡寫圖片描述

RecyclerView

RecyclerView 這個控制元件是Google公司在Android5.0推出的,他的主要的特點就是複用。我們知道,Listview中的Adapter中可以實現ViewHolder的複用。RecyclerView提供了一個耦合度更低的方式來複用ViewHolder(內部已經實現了ViewHolder,我們使用的時候重寫就好了,這樣就規格化了),並且可以輕鬆的實現ListView、GridView以及瀑布流的效果。所以我們完全可以通過使用RecyclerView來實現ListView以及GridView。
我們先來簡單介紹一下RecyclerView:RecyclerView 是Android-support-v7-21 版本中新增的一個 Widgets,官方對於它的介紹則是:RecyclerView 是 ListView 的升級版本,更加先進和靈活。與經典的ListView相比,同樣擁有item回收複用的功能。
對於使用RecyclerView我們只需要要考慮下面幾個的實現:

名稱 功能
Adapter 包裝資料集合並且為每個條目建立檢視
ViewHolder 儲存用於顯示每個資料條目的子View
LayoutManager 將每個條目的檢視放置於適當的位置
ItemAnimator 在條目被新增、移除或者重排序時新增動畫效果
ItemDecoration 在每個條目的檢視的周圍或上面繪製一些裝飾檢視
package com.gin.xjh.shin_music.adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.gin.xjh.shin_music.R;
import com.gin.xjh.shin_music.bean.Song;

import java.util.List;

/**
 * Created by Gin on 2018/4/24.
 */

public class recommendmusicRecyclerViewAdapter extends RecyclerView.Adapter<recommendmusicRecyclerViewAdapter.MusicViewHolder> {
    public List<Song> list;
    private Context context;

    @Override
    public recommendmusicRecyclerViewAdapter.MusicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new MusicViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recommend_music_item,parent,false));
    }

    //繫結檢視
    @Override
    public void onBindViewHolder(recommendmusicRecyclerViewAdapter.MusicViewHolder holder, int position) {
        holder.load(list.get(position),context);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public recommendmusicRecyclerViewAdapter(Context context, List<Song> list) {
        this.list = list;
        this.context=context;
    }


    public class MusicViewHolder extends RecyclerView.ViewHolder{
        private TextView SongName,SingerName;
        private ImageView cover;

        public MusicViewHolder(View itemView){
            super(itemView);
            SongName=itemView.findViewById(R.id.itemSongName);
            SingerName=itemView.findViewById(R.id.itemSingerName);
            cover=itemView.findViewById(R.id.cover);
        }

        public void load(Song song, final Context context) {
            SongName.setText(song.getSongName());
            SingerName.setText(song.toString());
            Drawable drawable = context.getResources().getDrawable(R.drawable.dayemen);
            BitmapDrawable bd = (BitmapDrawable) drawable;
            Bitmap bitmap = bd.getBitmap();
            cover.setImageBitmap(bitmap);//測試
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context,"check it",Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
}

使用RecyclerView,設定LayoutManager,ItemAnimator以及ItemDecoration。

//RecyclerView
mRecommendmusicRecyclerViewAdapter = new recommendmusicRecyclerViewAdapter(getContext(),mSongList);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.setItemAnimator(new DefaultItemAnimator());//預設動畫
mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(),DividerItemDecoration.VERTICAL));
mRecyclerView.setAdapter(mRecommendmusicRecyclerViewAdapter);

這裡寫圖片描述