张小龙宣布微信小程序可直接从桌面进入
昨晚,微信之父张小龙再次在朋友圈公布微信小程序最新进展,表示“程序猿的一小步,程序的一大进步”。微信小程序公测以来,对于小程序的入口问题,一直是大家心里的疑问。从张小龙公布的图片中可以看到,桌面图标第三行的第三个正是在小程序测试者开发的产品。也就是说,用户将可以直接从桌面进入微信小程序。但值得注意的是,照片中的手机是安卓系统,对于iOS系统的支持情况还不得而知。
Android RecyclerView单击、长按事件:基于OnItemTouchListener + GestureDetector标准实现
Android RecyclerView虽然拥有ListView绝大多数的功能,但Android RecyclerView却没有实现像ListView那样的点击事件、长按事件的标准实现方式,我在附录文章1中介绍的方式,实现了典型的RecyclerView的item点击事件,大致的思路是通过为RecyclerView的ViewHolder添加View.OnClickListener事件达到点击事件的监听,这种实现方式可以正常工作,但不太标准。现在给出一种较为规范的Android官方实现。
翻了Android RecyclerView的官方文档,这文档中确实没有提供像ListView的OnItem点击事件,但是注意到有一个addOnItemTouchListener,根据官方文档的描述,addOnItemTouchListener是Android官方文档中留下的点击事件的线索入口,文档中也暗示开发者应该从这个事件监听接口中实现所需的逻辑代码。但是直接new一个对象传递过去,则需要自己解析Android Touch Event复杂的处理,所幸Android官方给出了RecyclerView.SimpleOnItemTouchListener,顾名思义,就是一个简化的OnItemTouchListener。虽然有了SimpleOnItemTouchListener,到此还没完,因为SimpleOnItemTouchListener只是事件拦截处理的入口,真正要做事情的主角是:GestureDetector。通过GestureDetector里面的拦截到的所托管的单击、长按事件,才最终实现了RecyclerView的单击、长按事件。
完整代码:
package zhangphil.app;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private GestureDetector mGestureDetector;
//长按事件
private OnItemLongClickListener mOnItemLongClickListener = new OnItemLongClickListener() {
@Override
public void onItemLongClick(int position, View childView) {
Toast.makeText(getApplication(), "长按:" + position, Toast.LENGTH_SHORT).show();
}
};
//单击事件
private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(int position, View childView) {
Toast.makeText(getApplication(), "单击:" + position, Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建一个简单的用以测试的RecyclerView
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(new ItemAdapter());
//以下是添加点击、长按事件的关键代码
mRecyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
if (mGestureDetector.onTouchEvent(e)) {
return true;
}
return false;
}
});
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
//长按事件
@Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
if (mOnItemLongClickListener != null) {
View childView = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (childView != null) {
int position = mRecyclerView.getChildLayoutPosition(childView);
mOnItemLongClickListener.onItemLongClick(position, childView);
}
}
}
//单击事件
@Override
public boolean onSingleTapUp(MotionEvent e) {
if (mOnItemClickListener != null) {
View childView = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (childView != null) {
int position = mRecyclerView.getChildLayoutPosition(childView);
mOnItemClickListener.onItemClick(position, childView);
return true;
}
}
return super.onSingleTapUp(e);
}
});
}
//长按事件接口
public interface OnItemLongClickListener {
public void onItemLongClick(int position, View childView);
}
//单击事件接口
public interface OnItemClickListener {
public void onItemClick(int position, View childView);
}
private class ItemViewHolder extends RecyclerView.ViewHolder {
public TextView text;
public ItemViewHolder(View itemView) {
super(itemView);
text = (TextView) itemView.findViewById(android.R.id.text1);
}
}
private class ItemAdapter extends RecyclerView.Adapter<ItemViewHolder> {
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = View.inflate(parent.getContext(), android.R.layout.simple_list_item_1, null);
ItemViewHolder holder = new ItemViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
holder.text.setText(String.valueOf(position));
}
@Override
public int getItemCount() {
return 99;
}
}
}
因为我是在onInterceptTouchEvent里面拦截了RecyclerView的触摸事件,并通过GestureDetector
托管处理,由此可以延伸、进一步封装出更多更复杂的事件处理接口。
附录:
1,《RecyclerView点击事件》链接:http://blog.csdn.net/zhangphil/article/details/46771865
微信关注我们
转载内容版权归作者及来源网站所有!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。
Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。
Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。