相关疑难解决方法(0)

为什么RecyclerView没有onItemClickListener()?

我正在探索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()

是否有性能问题或其他问题?

java android android-recyclerview

940
推荐指数
17
解决办法
36万
查看次数

RecyclerView:检测到不一致.商品位置无效

我们的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 android-layout screen-rotation android-recyclerview

240
推荐指数
13
解决办法
10万
查看次数

Kotlin中的RecyclerView itemClickListener

我在使用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)

但我仍然对此不满意,因为我认为可能会有更好,更清洁的方式.我试图基本上实现这样的事情: …

android kotlin android-recyclerview

39
推荐指数
11
解决办法
5万
查看次数

如何在recyclerView项目onclick上打开不同的活动

我使用的是recyclerView展示我listitemsnavigation drawer.我已经实现了onclickListener,但我一直停留在如何打开一个不同的activity时,项目clicked.我的所有项目都在项目点击截至目前按代码显示toastitem 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 android-recyclerview

34
推荐指数
4
解决办法
8万
查看次数

OnLongItem点击RecyclerView

我开始在Android中使用RecyclerView.在我为我的适配器实现触摸侦听器之前,工作正常.

从这个主题:

/sf/answers/1877868471/

我可以正确实现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)

android onlongclicklistener android-recyclerview

19
推荐指数
1
解决办法
3万
查看次数

在Activity中定义RecyclerView的onCLickListener

RecyclerView与ListView不同,因为它不提供onItemCLickListener类来处理单击事件.

如果通过在ViewHolder中定义onClickListener,单击项目后幕后不会发生很多事情,则可以解决此问题.

如果文本或其他任何必须传递给下一个Activity的内容在ViewHolder有权访问的视图中确实存在,但它是具有RecyclerView的Activity的一部分呢?

在这种情况下,必须在活动内部实现onClickListener,以便可以转发文本.有可能的.

  1. 一种方法是添加一个隐藏视图的Invisible View,然后执行之前已经完成的操作; 在适配器中实现onClickListener.

  2. 不知何故,将该文本传递给适配器.

怎么能"2" 实施?

android android-recyclerview

14
推荐指数
2
解决办法
4万
查看次数

Android L的RecyclerView面临的挑战

我一直在玩RecyclerView一会儿.是否有任何简单的方法来放入OnClickListener物品RecyclerView?我试过实现它ViewHolder.onClick事件从未被触发.

而且我用它notifyItemInserted(position)来增加新的价值RecyclerView.用户界面没有自动刷新.需要上下拉动才能刷新.但是当我调用时notifyDatasetChanged(..),它没问题.

我申请DefaultItemAnimatorRecyclerView.但是,添加新项目时看不到任何动画.

感谢提前任何想法.

这是我测试过的第一个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)

android android-5.0-lollipop android-recyclerview

11
推荐指数
1
解决办法
7180
查看次数

RecyclerView - 我应该在哪里处理其点击事件?

在引入RecyclerView(及其强制ViewHolder模式)之前,我通常将任何单击事件委托给其对应Activity/ Fragment使用setOnItemClickListener().(因为我在开发Android时主要看Activity/ Fragment作为"控制器"对象,因此应该在视图中对视图进行任何修改.)

现在,RecyclerView并没有真正以同样的方式对待它的孩子,并且setOnItemClickListener()不再为它实现那些(或类似的)方法 - 我应该在哪里处理可能发生的点击事件?我不知道......但处理它们Adapter对我来说似乎很尴尬.

我们该怎么做呢?

提前致谢!

android android-adapter android-adapterview

10
推荐指数
1
解决办法
8487
查看次数

如何在回收站视图中使用OnClickListener?

我基本上要做的是让回收器视图中显示的对象可以点击某个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

10
推荐指数
1
解决办法
1万
查看次数

如何在RecyclerView中显示ArrayList?

我需要添加一个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)

java android arraylist android-adapter android-recyclerview

10
推荐指数
1
解决办法
3万
查看次数