自定义view中对于activity事件处理

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数据列表,待续

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值