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);