ListView项为选择器的LongClick状态

时间:2011-01-22 16:19:48

标签: android listview background selector

在默认的ListViews上,如果您长按某个项目,则在注册LongClick所需的时间内,背景会从深蓝色变为淡蓝色(在Galaxy Tab上。在其他某些设备上为橙色至浅橙色)。我假设这是用选择器以某种方式完成的,但到目前为止我只看到如何使用选择器进行状态:选中,状态:聚焦和状态:按下。

This page似乎没有显示任何关于LongClick状态的信息,所以也许我假设这是用选择器完成的是不正确的?

任何人都可以告诉我默认ListView如何获得此效果以及如何将其应用于其他视图?

3 个答案:

答案 0 :(得分:4)

所以事实证明这比我想象的要困难一些,但我现在几乎正确地工作了。

这是我最终使用的OnTouchListener:

listOnTouchListener = new OnTouchListener() {
         public boolean onTouch(View v, MotionEvent me){
             if (me.getAction() == MotionEvent.ACTION_DOWN){
                 //This means a finger has come down on top of our view
                 //We are going to start the animation now.
                 Log.i(myTag, "Action Down");
                 Context mContext = getApplicationContext();
                 Resources res = mContext.getResources();
                 TransitionDrawable transition = (TransitionDrawable) res.getDrawable(R.drawable.listtransition);
                 v.setBackgroundDrawable(transition);
                 //LongClick took approx. 510-530 milliseconds to register after OnTouch. So I set the duration at 500 millis.
                 transition.startTransition(500);
             }else if (me.getAction() == MotionEvent.ACTION_UP){
                 //This means we didn't hold long enough to get a LongClick
                 //Set the background back to the normal one.
                 v.setBackgroundResource(R.drawable.bubblelight);

             }else if (me.getAction() == MotionEvent.ACTION_MOVE){
                 //Do Nothing
             }else if (me.getAction() == MotionEvent.ACTION_CANCEL){
                 Log.i(myTag, "Action Cancel");
                 //This means we are scrolling on the list, not trying to longpress
                 //So set the background back to the normal one.
                 v.setBackgroundResource(R.drawable.bubblelight);
             }
             return false;

         }
     };

我也在其中使用了OnLongClickListener,我将背景设置回正常的。

这是Transition XML:

<transition xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@drawable/bubblelight1" />
  <item android:drawable="@drawable/bubbledark" />
</transition>

你可能会问起bubblelight1是什么?稍等一下。

这是我在我的适配器中使用的getView()方法,用于返回显示在List中的视图:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);
        }
        Status s = items.get(position);
        if (s != null) {
            v.setOnTouchListener(listOnTouchListener);
            v.setOnLongClickListener(listOnLongClickListener);
            tweetTxt = (TextView) v.findViewById(R.id.tweetTxt);
            timeTxt = (TextView) v.findViewById(R.id.timeTxt);
            if (tweetTxt != null) {
                tweetTxt.setText(s.getText());
                tweetTxt.setOnTouchListener(gestureListener);
            }
            if(timeTxt != null){
                timeTxt.setText(getTimeFromNow(s.getCreatedAt().getTime()));
                //timeTxt.setText(s.getCreatedAt().toLocaleString());
            }
        }
        LinkifyWithTwitter.addLinks(tweetTxt, Linkify.ALL);
        return v;
    }

v.setOnTouchListener(listOnTouchListener);和 v.setOnLongClickListener(listOnLongClickListener);是我用上面显示的监听器设置视图的行。

现在关于bubblelight1。 bubblelight和bubbledark是我正在使用的九个补丁图像,当我第一次尝试这种情况时,无论何时转换开始而不是背景从bubblelight转换到bubbledark,bubblelight会变大,bubbledark会出现在bubblelight中。所以我有一个很大的泡泡,一个较小的泡沫是黑暗的,然后是里面的文字。为了解决这个问题,我制作了一个bubblelight的副本,并使九个补丁的底部和右边完全填满。我只需要在转换过程中做第一个图像,而不是第二个。如果我按照这样的方式拍摄第二张图像,那么我的文字就会从气泡中跳出来,有些会在气泡顶部和两侧显示出来。我不完全确定为什么会这样,或者为什么这个修复工作正常。但它现在完成了这项工作。

答案 1 :(得分:1)

http://developer.android.com/guide/topics/ui/menus.html#context-menu

  

当用户对ListView中的项目执行长按并且注册列表以提供上下文菜单时,列表项通过动画化其背景颜色向用户发出上下文菜单可用的信号 - 它从打开上下文菜单之前,橙色到白色。 (“联系人”应用程序演示了此功能。)

所以它是一个使用的动画。我相信它使用View自己的默认On ...()方法来显示它。您可能需要担心给它clickable =“true”或longClickable =“true”属性。

答案 2 :(得分:0)

除了OnTouchListener之外,您还可以使用Runnable将背景恢复为原始状态,这样您就不需要在OnLongClick处理程序中显式执行此操作。

Handler myHandler = new Handler();
...
transition.startTransition(ViewConfiguration.getLongPressTimeout());
ResetBG r = new ResetBG(transition);
myHandler.postDelayed(r, ViewConfiguration.getLongPressTimeout());

其中ResetBG是:

class ResetBG implements Runnable {
    protected TransitionDrawable myTran;

    public Runnable(TransitionDrawable tran) {
        myTran = tran;
    }

    public void run() {
        myTran.resetTransition();
    }
}