【问题标题】:Check end of long click in listview - Android检查列表视图中长按的结束 - Android
【发布时间】:2017-03-21 20:11:26
【问题描述】:

我有问题。在我的列表视图 (lv) 中,我有方法可以捕捉其中的项目点击长点击

  • 单击项目时,会打开新意图。效果很好。
  • 然后我有长按监听器,长按 textview 中的长文本开始滚动(marquee)。但我无法检测到,当用户停止持有该项目时,停止移动文本。

我的代码:(我必须在 java 中设置,因为在 xml 中它不起作用)

lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

  @Override
  public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int pos, long id) {
    arg1.findViewById(R.id.jmenoskoly);
    TV = (TextView) arg1.findViewById(R.id.jmenoskoly);
    TV.setEllipsize(TextUtils.TruncateAt.MARQUEE);
    TV.setSingleLine(true);
    TV.setMarqueeRepeatLimit(5);
    TV.setSelected(true);

    return true;
  }

});

所以我的问题是:如何检查用户是否停止在列表视图中持有该项目?(请完整的代码示例。)

【问题讨论】:

  • have tried to measure how long user holds? onItemLongClick 在固定延迟后触发一次,与您要跟踪的用户动作无关
  • 我想检测用户是否拿起他的手指。 (来自 listview 项目或屏幕 = 相同的结果。)
  • TouchListener 跟踪向下和向上状态,但您可能必须实现一个自定义适配器来为每个项目设置一个。

标签: android listview


【解决方案1】:

使用 TouchListener 创建一个自定义适配器类。您可以在向下操作时启动选取框并在向上操作时停止它:

public class MyAdapter extends BaseAdapter{

    private Context mContext;
    private ArrayList<String> mItems; // However you want to store your data

    private static class ViewHolder{
        // Put the views you want to interact with here
        TextView textView;

        ViewHolder(View view){
            textView = (TextView) view.findViewById(R.id.text_view);
        }
    }

    public MyAdapter(Context context, ArrayList<String> items){
        mContext = context;
        mItems = items;
    }

    @Override
    public int getCount(){
        return mItems.size();
    }

    @Override
    public String getItem(int position){
        return mItems.get(position);
    }

    @Override
    public long getItemId(int position){
        return position;
    }

    public void add(String item){
        mItems.add(item);
        notifyDataSetChanged();
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent){

        ViewHolder viewHolder;

        // You don't have to use the ViewHolder pattern but it's meant to
        // optimize performance
        if(convertView == null){
            convertView = LayoutInflater.from(mContext)
                    .inflate(R.layout.my_item_layout, parent, false);

            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);

        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }

        // Set the values of your views
        viewHolder.textView.setText(mItems.get(position));

        // Set your listener on the desired view
        viewHolder.textView.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                switch(event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        // Do something on the down action
                        return true; // Consume the action

                    case MotionEvent.ACTION_UP:
                        // Do something on the up action
                        return true; // Consume the action
                }
                return false;
            }
        });

        return convertView;
    }
}

然后在您的活动中:

// Create a new instance of your custom Adapter
// passing in the Context and item values
MyAdapter adapter = new MyAdapter(context, myItems);
listview.setAdapter(adapter); // Attach Adapter to ListView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2015-10-31
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多