万能adapter类CommonAdapter
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.example.ju.apklock.R;
import java.util.List;
/**
* Created by ju on 2018/4/13.
*/
public abstract class CommonAdapter<T> extends BaseAdapter {
private Context context;
private List<T> list;
public CommonAdapter(Context context, List<T> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list == null ? 0 : list.size();
}
@Override
public T getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder = ViewHolder.get(view,viewGroup, R.layout.apklistview_item,i);
convert(holder,getItem(i));
return holder.getConvertView();
}
public abstract void convert(ViewHolder holder,T item);
}
CommonAdapter中对应的ViewHolder
import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.ju.apklock.R;
/**
* Created by ju on 2018/4/13.
*/
public class ViewHolder {
//现在对于int作为键的官方推荐用SparseArray替代HashMap
private final SparseArray<View> views;
private int position;
private View convertView;
private Context context;
private ViewHolder(Context context, ViewGroup parent, int layoutId, int position) {
this.context = context;
this.views = new SparseArray<>();
this.convertView = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
convertView.setTag(this);
}
/**
* 拿到一个ViewHolder对象
*/
public static ViewHolder get(View convertView, ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
return new ViewHolder(parent.getContext(), parent, layoutId, position);
}
return (ViewHolder) convertView.getTag();
}
/**
* 通过控件的Id获取对于的控件,如果没有则加入views
*/
public <T extends View> T getView(int viewId) {
View view = views.get(viewId);
if (view == null) {
view = convertView.findViewById(viewId);
views.put(viewId, view);
}
return (T) view;
}
public View getConvertView() {
return convertView;
}
/**
* 设置字符串
*/
public ViewHolder setText(int viewId, String text) {
TextView tv = getView(viewId);
tv.setText(text);
return this;
}
/**
* 设置图片
*/
public ViewHolder setImageResource(int viewId, int drawableId) {
ImageView iv = getView(viewId);
iv.setImageResource(drawableId);
return this;
}
/**
* 设置图片
*/
public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
ImageView iv = getView(viewId);
iv.setImageBitmap(bitmap);
return this;
}
/**
* 设置图片
*/
public ViewHolder setImageByUrl(int viewId, String url) {
Glide.with(context).load(R.drawable.maoa).into((ImageView) getView(viewId));
// ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context));
// ImageLoader.getInstance().displayImage(url, (ImageView) getView(viewId));
return this;
}
public int getPosition() {
return position;
}
}
在界面中的使用方式及利用此方式实现应用锁布局
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import com.example.ju.apklock.Util.CommonAdapter;
import com.example.ju.apklock.Util.ProgramData;
import com.example.ju.apklock.Util.ViewHolder;
import java.util.ArrayList;
import java.util.List;
/**
* A placeholder fragment containing a simple view.
*/
public class MainFragment extends Fragment {
private ListView listView;
private List<ProgramData> list;
public MainFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
listView = (ListView) rootView.findViewById(R.id.listView);
initList();
listView.setAdapter(new CommonAdapter<ProgramData>(getActivity(),list) {
@Override
public void convert(ViewHolder holder, ProgramData item) {
holder.setText(R.id.item_name,item.getName());
if(item.getImageUrl()!=null){
holder.setImageByUrl(R.id.item_picture,item.getImageUrl());
}else{
holder.setImageResource(R.id.item_picture,item.getImageID());
}
if(item.islock()){
holder.setImageResource(R.id.item_islock,R.drawable.lock);
}else{
holder.setImageResource(R.id.item_islock,R.drawable.unlock);
}
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ProgramData data = list.get(position);
data.setIslock(!data.islock());
View iview = listView.getChildAt(position-listView.getFirstVisiblePosition());//由于复用机制必须先计算实际内存中的posion
ViewHolder holder = (ViewHolder) iview.getTag();
if(data.islock()){
holder.setImageResource(R.id.item_islock,R.drawable.lock);
}else{
holder.setImageResource(R.id.item_islock,R.drawable.unlock);
}
}
});
return rootView;
}
private void initList() {
list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(new ProgramData("程序 "+(i+1),R.drawable.maoa));//初始化数据源
}
}
}
programData类的实现方式如下,可根据填充数据需要自行定义。
/**
* Created by ju on 2018/4/13.
*/
public class ProgramData {
private String name;
private String ImageUrl;
private int ImageID;
private boolean islock;
public ProgramData(String name,String ImageUrl){
this.name = name;
this.ImageUrl = ImageUrl;
}
public ProgramData(String name,int ImageID){
this.name = name;
this.ImageID = ImageID;
}
public String getImageUrl() {
return ImageUrl;
}
public void setImageUrl(String imageUrl) {
this.ImageUrl = imageUrl;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImageID(){
return ImageID;
}
public void setImageID(int ImageID){
this.ImageID = ImageID;
}
public boolean islock() {
return islock;
}
public void setIslock(boolean islock) {
this.islock = islock;
}
}