我正在探索RecyclerView
,我很惊讶地看到RecyclerView
它没有onItemClickListener()
.因为RecyclerView
延伸
android.view.ViewGroup
并ListView
扩展
android.widget.AbsListView
.不过,我解决我的问题写onClick
在我的RecyclerView.Adapter
:
public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
public TextView txtViewTitle;
public ImageView imgViewIcon;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
}
@Override
public void onClick(View v) {
}
}
Run Code Online (Sandbox Code Playgroud)
但我仍然想知道为什么谷歌被删除了onItemClickListener()
?
是否有性能问题或其他问题?
我们的QA检测到一个错误:当旋转Android设备(Droid Turbo)时,发生以下与RecyclerView相关的崩溃:
java.lang.IndexOutOfBoundsException:检测到不一致.无效的项目位置2(偏移量:2).state:3
对我来说,它看起来像RecyclerView内部的一个内部错误,因为我无法想到这是由我们的代码直接导致的任何方式......
有谁遇到过这个问题?
什么是解决方案?
一个残酷的解决方法可能是在发生异常时捕获异常并从头开始重新创建RecyclverView实例,以避免陷入损坏状态.
但是,如果可能的话,我想更好地理解这个问题(并且可能在其源头修复它),而不是掩盖它.
这个bug很难重现,但是当它发生时它是致命的.
完整的堆栈跟踪:
W/dalvikvm(7546):threadid = 1:线程退出,未捕获异常(组= 0x41987d40)E/AndroidRuntime(7546):致命异常:主E/AndroidRuntime(7546):进程:com.oblong.mezzedroid,PID:7546 E/AndroidRuntime(7546):java.lang.IndexOutOfBoundsException:检测到不一致.无效的项目位置2(偏移量:2).state:3 E/AndroidRuntime(7546):在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:3382)E/AndroidRuntime(7546):at android .support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:3340)E/AndroidRuntime(7546):at android.support.v7.widget.LinearLayoutManager $ LayoutState.next(LinearLayoutManager.java:1810)E/AndroidRuntime (7546):在android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1306)E/AndroidRuntime(7546):在android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1269)E/AndroidRuntime(7546):在android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:523)E/AndroidRuntime(7546):at org.liboid.recycler_view.RecyclerViewContainer $ LiLinearLayoutManager.onLayoutChildren(RecyclerViewContainer.java:179 )E/AndroidRuntime(7546):在android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1942))E/AndroidRuntime(7546):在android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2237)E/AndroidRuntime(7546):at org.liboid.recycler_view.LiRecyclerView.onLayout(LiRecyclerView.java:30) )E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546) ):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)E/AndroidRuntime(7546):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)E/AndroidRuntime(7546):在android.view .View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.FrameLayout.layoutChildren(FrameLayout) .java:453)E/AndroidRuntime(7546):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)E/AndroidRuntime(7546):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)E/AndroidRuntime( 7546):在android.widget.LinearLayout.onLayout(LinearLayout.java:1434)E/AndroidRuntime(7546):at com.oblong.mezzedroid.workspace.content.bins.BinsContainerLayout.onLayout(BinsContainerLayout.java:22)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)E/AndroidRuntime(7546):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)E/AndroidRuntime(7546):在android.widget.LinearLayout. onLayout(LinearLayout.java:1434)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java: 4651)E/Android 运行时(7546):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)E/AndroidRuntime(7546):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)E/AndroidRuntime(7546):at android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.FrameLayout. layoutChildren(FrameLayout.java:453)E/AndroidRuntime(7546):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)E/AndroidRuntime(7546):在android.view.View.layout(View.java: 14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)E/AndroidRuntime( 7546):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)E/AndroidRuntime(7546):在android.widget.LinearLayout.onLayout(LinearLayout.java:1434)E/AndroidRuntime(7546):在android. view.View.layout(View.java:14946)E/Andro idRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)E/AndroidRuntime(7546):at android.widget.FrameLayout.onLayout(FrameLayout.java:388)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup. layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)E/AndroidRuntime(7546):在android.widget.LinearLayout.layoutVertical(LinearLayout.java: 1525)E/AndroidRuntime(7546):在android.widget.LinearLayout.onLayout(LinearLayout.java:1434)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime( 7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)E/AndroidRuntime(7546):在android. widget.FrameLayout.onLayout(FrameLayout.java:3 88)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime( 7546):在android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2132)E/AndroidRuntime(7546):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1872)E/AndroidRuntime(7546):at andro
我在使用Android 3年后,正在Kotlin编写我的第一个应用程序.只是混淆了如何在Kotlin中使用itemClickListener和RecyclerView.
我尝试过特征(编辑:现在界面)方法,非常类似于Java
public class MainActivity : ActionBarActivity() {
protected override fun onCreate(savedInstanceState: Bundle?) {
// set content view etc go above this line
class itemClickListener : ItemClickListener {
override fun onItemClick(view: View, position: Int) {
Toast.makeText(this@MainActivity, "TEST: " + position, Toast.LENGTH_SHORT).show()
}
}
val adapter = DrawerAdapter(itemClickListener())
mRecyclerView.setAdapter(adapter)
}
trait ItemClickListener {
fun onItemClick(view: View, position: Int)
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎非常多余,所以我尝试了内部类方法:
inner class ItemClickListener {
fun onItemClick(view: View, position: Int) {
startActivityFromFragmentForResult<SelectExerciseActivity>(SELECT_EXERCISES)
}
}
Run Code Online (Sandbox Code Playgroud)
然后只需设置适配器的点击监听器,如下所示:
val adapter = WorkoutsAdapter(ItemClickListener())
Run Code Online (Sandbox Code Playgroud)
但我仍然对此不满意,因为我认为可能会有更好,更清洁的方式.我试图基本上实现这样的事情: …
我使用的是recyclerView
展示我listitems
的navigation drawer
.我已经实现了onclickListener
,但我一直停留在如何打开一个不同的activity
时,项目的clicked
.我的所有项目都在项目点击截至目前按代码显示toast
用item position
.
我很感激你的帮助.
AdapterClass.java
public class AdapterClass extends RecyclerView.Adapter<AdapterClass.MyViewHolder> {
private LayoutInflater inflater;
private Context context;
List<Information>data= Collections.emptyList();
public AdapterClass(Context context,List<Information>data){
this.context=context;
inflater= LayoutInflater.from(context);
this.data=data;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view= inflater.inflate(R.layout.custom_row,parent,false);
MyViewHolder holder=new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Information current=data.get(position);
holder.title.setText(current.title);
holder.icon.setImageResource(current.iconId);
}
@Override
public int getItemCount() { …
Run Code Online (Sandbox Code Playgroud)我开始在Android中使用RecyclerView.在我为我的适配器实现触摸侦听器之前,工作正常.
从这个主题:
我可以正确实现childview的监听器.但是,我想实现OnItemClick和OnItemLongClick,然后出现问题.他们总是同时被解雇.OnItemClick首先和OnItemLongClick稍后,这使我的函数无用.
这是我的自定义监听器的代码(基于上面的代码,感谢Fouad):
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;
public static interface OnItemClickListener {
public boolean onItemClick(View view, int position);
public void onItemLongClick(View view, int position);
}
GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != …
Run Code Online (Sandbox Code Playgroud) RecyclerView与ListView不同,因为它不提供onItemCLickListener类来处理单击事件.
如果通过在ViewHolder中定义onClickListener,单击项目后幕后不会发生很多事情,则可以解决此问题.
如果文本或其他任何必须传递给下一个Activity的内容在ViewHolder有权访问的视图中确实存在,但它是具有RecyclerView的Activity的一部分呢?
在这种情况下,必须在活动内部实现onClickListener,以便可以转发文本.有可能的.
一种方法是添加一个隐藏视图的Invisible View,然后执行之前已经完成的操作; 在适配器中实现onClickListener.
不知何故,将该文本传递给适配器.
怎么能"2" 实施?
我一直在玩RecyclerView
一会儿.是否有任何简单的方法来放入OnClickListener
物品RecyclerView
?我试过实现它ViewHolder
.onClick事件从未被触发.
而且我用它notifyItemInserted(position)
来增加新的价值RecyclerView
.用户界面没有自动刷新.需要上下拉动才能刷新.但是当我调用时notifyDatasetChanged(..)
,它没问题.
我申请DefaultItemAnimator
了RecyclerView
.但是,添加新项目时看不到任何动画.
感谢提前任何想法.
这是我测试过的第一个Android L组件,我一直在那里.
这是我的Adapter类:
public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.MyViewHolder> {
private List<String> arrExperiences;
//Provide a reference to the type of views that you are using - Custom ViewHolder
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView tvExperienceTitle;
public TextView tvExperienceDesc;
public MyViewHolder(RelativeLayout itemView) {
super(itemView);
tvExperienceTitle = (TextView) itemView.findViewById(R.id.tv_experience_title);
tvExperienceDesc = (TextView) itemView.findViewById(R.id.tv_experience_desc);
}
} …
Run Code Online (Sandbox Code Playgroud) 在引入RecyclerView
(及其强制ViewHolder
模式)之前,我通常将任何单击事件委托给其对应Activity
/ Fragment
使用setOnItemClickListener()
.(因为我在开发Android时主要看Activity
/ Fragment
作为"控制器"对象,因此应该在视图中对视图进行任何修改.)
现在,RecyclerView
并没有真正以同样的方式对待它的孩子,并且setOnItemClickListener()
不再为它实现那些(或类似的)方法 - 我应该在哪里处理可能发生的点击事件?我不知道......但处理它们Adapter
对我来说似乎很尴尬.
我们该怎么做呢?
提前致谢!
我基本上要做的是让回收器视图中显示的对象可以点击某个TextView id,因为我正在制作一个程序,在列表中显示一个专辑封面及其旁边的标题.我需要能够点击回收者视图所做的每一个方框,并在点击时弹出带有其他信息(作者,发布日期,热门歌曲等)的TextView,然后再按一个后退按钮(如果可以)回到专辑列表.我已经看了好几个小时,无法弄清楚如何让OnclickListener为它工作.如果您知道如何或有任何建议,我很高兴听到他们.谢谢!
package com.albumlist.albumlist;
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private AlbumData[] itemsData;
public MyAdapter(AlbumData[] itemsData){
this.itemsData = itemsData;
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView txtViewTitle;
private ImageView imgViewIcon;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
itemLayoutView.setOnClickListener(this);
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.album_title);
imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.album_icon);
}
@Override
public void onClick(View v) {
}
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup …
Run Code Online (Sandbox Code Playgroud) java android onclicklistener android-studio android-recyclerview
我需要添加一个Activity
我可以列出的元素,ArrayList<CustomClass>
我已经看到有一种更新,更好的方式来显示列表 - RecyclerView
.
我的问题是如何将此实现到我的应用程序中.我发现我需要使用Adapter
,但我不太明白如何正确实现整个过程.
如果你想知道,我指的是这个的文档的例子,这是我一直在读.
编辑:
更新了我的代码后,它说它无法解析符号setOnEntryClickListener
:
public class voting extends Activity {
RecyclerView myList;
private ArrayList<Player> players; // Players
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_voting);
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
players = (ArrayList<Player>)bundle.getSerializable("PLAYERS");
myList = (RecyclerView) findViewById(R.id.charactersList);
myList.setLayoutManager(new LinearLayoutManager(this));
CoursesAdapter adapter = new CoursesAdapter(players);
myList.setAdapter(adapter);
}
// OR RecyclerView with a click listener
CoursesAdapter clickAdapter = new CoursesAdapter(players);
clickAdapter.setOnEntryClickListener(new CoursesAdapter.OnEntryClickListener() {
@Override
public …
Run Code Online (Sandbox Code Playgroud)