package com.snail.travellingTrail.newTravel.controller;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.snail.travellingTrail.R;
import com.snail.travellingTrail.common.TravellingTrailApplication;
import com.snail.travellingTrail.common.utils.BitmapUtil;
import com.snail.travellingTrail.common.utils.UnitConversion;
import com.snail.travellingTrail.newTravel.model.ImageData;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.support.v4.util.LruCache;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.TextView.OnEditorActionListener;
public class ImageListAdapter extends BaseAdapter implements OnClickListener,
OnFocusChangeListener, OnEditorActionListener, OnScrollListener
{
ImageData data;
List<ImageData> dataList;
LayoutInflater layoutInflater;
Context context;
View currentEditing; //当前编辑中的输入框
LruCache<Long, Bitmap> bitmapCache;
ExecutorService executorService;
public ImageListAdapter(List<ImageData> dataList, Context context)
{
super();
this.dataList = dataList;
this.context = context;
layoutInflater = LayoutInflater.from(context);
executorService = Executors.newFixedThreadPool(5);
final int memoryClass =
((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
final int memorySize = 1024*1024*memoryClass / 8;
bitmapCache = new LruCache<Long, Bitmap>(memorySize){
@Override
protected int sizeOf(Long key, Bitmap value)
{
return value.getByteCount();
}
};
}
public void setDataList(List<ImageData> dataList)
{
this.dataList = dataList;
}
@Override
public int getCount()
{
return dataList.size();
}
@Override
public Object getItem(int position)
{
return dataList.get(position);
}
@Override
public long getItemId(int position)
{
return dataList.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
data = dataList.get(position);
ViewHolder holder;
if (convertView == null)
{
convertView = layoutInflater.inflate(R.layout.listitem_new_footprint_content_list, null);
holder = new ViewHolder();
holder.image = (ImageView) convertView.findViewById(R.id.listitem_new_footprint_content_list_iv_image);
holder.name = (TextView) convertView.findViewById(R.id.listitem_image_manager_tv_name);
holder.remove = (ImageView) convertView.findViewById(R.id.listitem_new_footprint_content_list_iv_remove);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
setViewPositionTag(holder.image, position);
setViewPositionTag(holder.name, position);
setViewPositionTag(holder.remove, position);
setImage(holder.image);
holder.name.setText(data.getName());
holder.image.setOnClickListener(this);
holder.name.setOnClickListener(this);
holder.remove.setOnClickListener(this);
return convertView;
}
Handler handler = new Handler(new Callback()
{
@Override
public boolean handleMessage(Message msg)
{
ImageView imageView = (ImageView)msg.obj;
int position = getViewPositionTag(imageView);
long id = dataList.get(position).getId();
imageView.setImageBitmap(bitmapCache.get(Long.valueOf(id)));
return false;
}
});
Thread thread;
private void setImage(final View view)
{
final int position = getViewPositionTag(view);
final long id = dataList.get(position).getId();
if (dataList.get(position).getPath() != null
&& !dataList.get(position).getPath().equals("")) //非纯文字心情(有图片)
{
if (bitmapCache.get(Long.valueOf(id)) == null) // 缓存中没有该图的bitmap对象
{
// 线程池里执行
executorService.submit(new Runnable()
{
@Override
public void run()
{
Message msg = new Message();
bitmapCache.put(Long.valueOf(id), BitmapUtil.getBitmap(
dataList.get(position).getPath(), 5));
msg.obj = view;
handler.sendMessage(msg);
}
});
} else
{
Message msg = new Message();
msg.obj = view;
handler.sendMessage(msg);
}
}
}
private void setViewPositionTag(View view, int position)
{
view.setTag(Integer.valueOf(position));
}
private int getViewPositionTag(View view)
{
return ((Integer)view.getTag()).intValue();
}
static class ViewHolder
{
ImageView image;
TextView name;
ImageView remove;
}
@Override
public void onClick(View view)
{
switch (view.getId())
{
case R.id.listitem_new_footprint_content_list_iv_image:
Intent intent = new Intent(context, BigImageActivity.class);
intent.putExtra("ImageData", dataList.get(getViewPositionTag(view)));
context.startActivity(intent);
break;
case R.id.listitem_image_manager_tv_name:
addEditText(view);
break;
case R.id.listitem_new_footprint_content_list_iv_remove:
showRemoveDialog(view);
break;
default:
break;
}
}
private void showRemoveDialog(View view)
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
AlertDialog dialog = builder.create();
dialog.setTitle("提示");
dialog.setMessage("确定删除?");
dialog.setButton(Dialog.BUTTON_POSITIVE, "确定",
new OnRemoveListener(getViewPositionTag(view)));
dialog.setButton(Dialog.BUTTON_NEGATIVE, "取消",
new OnRemoveListener(getViewPositionTag(view)));
dialog.show();
}
class OnRemoveListener implements android.content.DialogInterface.OnClickListener
{
int position; //点击的item位置
public OnRemoveListener(int position)
{
super();
this.position = position;
}
@Override
public void onClick(DialogInterface dialog, int which)
{
removeItem(position);
}
}
private void removeItem(int position)
{
if (TravellingTrailApplication.getDbManager().removeImage(dataList.get(position)))
{
bitmapCache.remove(getItemId(position));
dataList.remove(position);
notifyDataSetChanged();
Toast.makeText(context, "删除成功!", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context, "删除失败!", Toast.LENGTH_SHORT).show();
}
}
/**
* 加入编辑框,隐藏文本框
* @param view
*/
private void addEditText(View view)
{
//先把尚未移除的输入框移除了
if (currentEditing != null) removeEditText(currentEditing);
EditText editText = new EditText(context);
editText.setLayoutParams(view.getLayoutParams());
RelativeLayout relativeLayout = (RelativeLayout) view.getParent();
view.setVisibility(View.GONE);
relativeLayout.addView(editText);
String name = (String) ((TextView)view).getText();
editText.setPadding(UnitConversion.dip2px(context, 9), 0,
UnitConversion.dip2px(context, 9), 0);
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.setSingleLine();
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setText(name);
editText.selectAll(); //全选
editText.requestFocus(); //获取焦点
//下面两句为弹出软键盘↓
InputMethodManager inputManager =
(InputMethodManager)editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText, 0);
setViewPositionTag(editText, getViewPositionTag(view));
editText.setOnFocusChangeListener(this);
editText.setOnEditorActionListener(this);
currentEditing = editText;
}
@Override
public void onFocusChange(View view, boolean hasFocus)
{
if (!hasFocus) removeEditText(view);
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
switch (actionId)
{
case EditorInfo.IME_ACTION_DONE: //输入确定
removeEditText(currentEditing);
break;
default:
break;
}
return false;
}
/**
* 移除输入框
* @param view
*/
private void removeEditText(final View view)
{
if (currentEditing == null)
{
return;
}
final RelativeLayout relativeLayout = (RelativeLayout) view.getParent();
String newName = ((EditText)view).getText().toString();
dataList.get(getViewPositionTag(view)).setName(newName); //获取Tag中的position值来修改list内数据
TravellingTrailApplication.getDbManager().reivseImageName(dataList.get(getViewPositionTag(view)));
//以下需使用handler才不会报空指针错误
new Handler().post(new Runnable()
{
@Override
public void run()
{
relativeLayout.removeView(view);
}
});
currentEditing = null;
TextView nameTextView = (TextView) relativeLayout.findViewById(R.id.listitem_image_manager_tv_name);
nameTextView.setText(newName);
nameTextView.setVisibility(View.VISIBLE);
}
public void name()
{
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
if (currentEditing != null)
{
removeEditText(currentEditing);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount)
{
}
}