activity中:
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
public class MainActivity extends Activity {
private TvListView mTvListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvListView = (TvListView) findViewById(R.id.tvlistview);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.d("debug", "onKeyDown= keyCode:" + keyCode);
mTvListView.onKeyDown(keyCode, event);//return
return super.onKeyDown(keyCode, event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP) {
mTvListView.dispatchEvent(event);
}
return super.dispatchKeyEvent(event);
}
}
自定义view中:
import java.util.ArrayList;
import java.util.List;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListView;
/**
* 直接点击黄色按钮点击则显示删除图标,再次点击删除图标消失,按返回选择是否删除选中项 在移动状态,相互交换位置
*
*/
public class TvListView extends LinearLayout {
private Context mContext;
private LayoutInflater layoutInflater;
private View view;
public TvListView(Context context, AttributeSet attrs) {
super(context, attrs);
layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.tvlistview, this);
mOperateArrayList = new ArrayList<Bean>();
mPreArrayList = new ArrayList<Bean>();
mListView = (ListView) view.findViewById(R.id.listView1);
mContext = context;
// 添加数据
for (int i = 0; i < 20; i++) {
Bean bean = new Bean("Item" + i, R.drawable.ic_launcher,
R.drawable.icon);
mOperateArrayList.add(bean);
mPreArrayList.add(bean);
}
// 生成适配器的Item和map元素对应
listAdapter = new RecentAdapter(mContext, mOperateArrayList);
// 添加并且显示
mListView.setAdapter(listAdapter);
}
private ListView mListView;
// 集合,保持移动次序,保持删除剩余条目,需要做备份用以回退
private List<Bean> mOperateArrayList;
// 保存之前一次操作后结果
private List<Bean> mPreArrayList;
private RecentAdapter listAdapter;
// 移动状态操作位置
private int focusPosition = -1;
// 删除状态
private boolean deleteState = false;
// 移动状态
private boolean moveState = false;
public void dispatchEvent(KeyEvent event) {
int key = event.getKeyCode();
// Log.i("debug", "[test] dispatchKeyEvent event = " + key);
// 按键抬起时响应
if (moveState
&& (key == KeyEvent.KEYCODE_DPAD_DOWN || key == KeyEvent.KEYCODE_DPAD_UP)
&& event.getAction() == KeyEvent.ACTION_UP) {
if (key == KeyEvent.KEYCODE_DPAD_DOWN) {
if (focusPosition > mOperateArrayList.size() - 2) {
// return true;
}
Bean item = mOperateArrayList.remove(focusPosition);
focusPosition = focusPosition + 1;
mOperateArrayList.add(focusPosition, item);
listAdapter.setMoveFocusPosition(focusPosition);
mListView.setSelection(focusPosition);
listAdapter.notifyDataSetChanged();
// return true;
} else if (key == KeyEvent.KEYCODE_DPAD_UP) {
if (focusPosition < 1) {
// return true;
}
Bean item = mOperateArrayList.remove(focusPosition);
focusPosition = focusPosition - 1;
mOperateArrayList.add(focusPosition, item);
listAdapter.setMoveFocusPosition(focusPosition);
mListView.setSelection(focusPosition);
listAdapter.notifyDataSetChanged();
// return false;
}
}
// return super.dispatchKeyEvent(event);
}
// 183 184 185 186
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 移动
if (keyCode == 184) {
focusPosition = mListView.getSelectedItemPosition();
Log.d("debug", "onKeyDown= focusItem:" + focusPosition);
// 开始移动
listAdapter.setMoveFocusPosition(focusPosition);
listAdapter.notifyDataSetChanged();
moveState = true;
// return true;
}
// 删除 直接在item后面显示图标
if (keyCode == 185) {
deleteState = true;
int deleteItem = mListView.getSelectedItemPosition();
boolean deleteState = mOperateArrayList.get(deleteItem)
.isDeleteState();
mOperateArrayList.get(deleteItem).setDeleteState(!deleteState);
listAdapter.notifyDataSetChanged();
// return true;
}
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (deleteState) {
// 弹出确认dialog
showDeleteDialog();
deleteState = false;
moveState = false;
} else if (moveState) {
showMoveDialog();
moveState = false;
deleteState = false;
} else {
// 重置
deleteState = false;
moveState = false;
for (int i = 0; i < mOperateArrayList.size(); i++) {
Bean b = mOperateArrayList.get(i);
b.setDeleteState(false);
}
listAdapter.notifyDataSetChanged();
// onBackPressed();
}
// return true;
}
return super.onKeyDown(keyCode, event);
}
// 有效操作集合跟进,无效操作回退到初始集合状态
protected void showMoveDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setMessage("确定移动选中项?").setCancelable(false)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
listAdapter.setMoveFocusPosition(-1);
listAdapter.notifyDataSetChanged();
mPreArrayList.clear();
mPreArrayList.addAll(mOperateArrayList);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
mOperateArrayList.clear();
mOperateArrayList.addAll(mPreArrayList);
listAdapter.setMoveFocusPosition(-1);
mListView.setAdapter(listAdapter);
listAdapter.notifyDataSetChanged();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
protected void showDeleteDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setMessage("确定删除选中项?").setCancelable(false)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
for (int i = 0; i < mOperateArrayList.size(); i++) {
Bean b = mOperateArrayList.get(i);
if (b.isDeleteState()) {
// mArrayList.remove(i);
mOperateArrayList.remove(b);
i--;
Log.i("debug", "mArrayList.remove(i) = " + i);
}
}
// 复合操作 移动删除
listAdapter.setMoveFocusPosition(-1);
listAdapter.notifyDataSetChanged();
mPreArrayList.clear();
mPreArrayList.addAll(mOperateArrayList);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
mOperateArrayList.clear();
mOperateArrayList.addAll(mPreArrayList);
// 复合操作 移动删除
listAdapter.setMoveFocusPosition(-1);
// TODO modify
for (int i = 0; i < mPreArrayList.size(); i++) {
mPreArrayList.get(i).setDeleteState(false);
mOperateArrayList.get(i).setDeleteState(false);
}
mListView.setAdapter(listAdapter);
listAdapter.notifyDataSetChanged();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
主要完成功能,操作一个list,根据不同的按键看做移动操作还是删除操作,维护一个arraylist数据列表,待续