【问题标题】:Disable Touch of inner RecyclerView禁用内部 RecyclerView 的触摸
【发布时间】:2016-03-07 11:01:36
【问题描述】:

我是 RecyclerView 的新手,我想像 Listview 一样实现 OnItemClickListner。为此,我使用以下代码。

public static class ViewHolder extends RecyclerView.ViewHolder {

    public RecyclerView recyclerView;

    public ViewHolder(View itemView) {
        super(itemView);

        recyclerView = (RecyclerView) itemView.findViewById(R.id.recycleViewIngredient);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              //Item Click Listner  
            }
        });
    }
}

它工作正常。问题是我在这个 Recyclerview 中有另一个 Recyclerview。如果我点击内部回收器视图,则父视图的项目单击列表器没有响应。我不想让内部 recyclerview 可点击。

任何帮助都会很棒。

【问题讨论】:

  • 这可能是一个愚蠢的决定,但您是否尝试将“clickable='true'”设置为父 recyclerview?
  • 是的,但没用。

标签: android android-recyclerview


【解决方案1】:

最简单的方法是创建自己的RecyclerView,覆盖onTouchEvent 并在您的XML 布局或代码中使用它。

public class MyDisabledRecyclerView extends RecyclerView {
    public MyDisabledRecyclerView(Context context) {
        super(context);
    }

    public MyDisabledRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MyDisabledRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return false;
    }
}

然后您可以在其他地方重复使用该小部件,而无需任何额外的逻辑。

【讨论】:

    【解决方案2】:

    您必须使用内部 RecycleView 类的接口,将它的 clickListener 放入父 RecycleView 类。这将起作用。

    这里是示例

      public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    ArrayList<String> strings ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    
        setSupportActionBar(toolbar);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        strings = new ArrayList<>();
    
        strings.add("A");
        strings.add("B");
        strings.add("C");
        strings.add("D");
        strings.add("E");
        strings.add("F");
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL,false));
    
        recyclerView.setAdapter(new MyAdapter(strings));
        recyclerView.setClickable(true);
        }
    }
    

    父适配器是

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    ArrayList<String> strings;
    
    public MyAdapter(ArrayList<String> strings) {
        this.strings=strings;
    }
    
    @Override
    public  ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter, parent, false);
        view.setLayoutParams(new ViewGroup.LayoutParams(200,200));
        return new ViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(final  ViewHolder holder, int position) {
         holder.textView.setText(strings.get(position));
        holder.recyclerView.setLayoutManager(new LinearLayoutManager(holder.recyclerView.getContext(), LinearLayoutManager.VERTICAL, false));
    
        holder.recyclerView.setAdapter(new MyChildAdapter(strings, new setOnClick() {
            @Override
            public void setOnClick() {
                Toast.makeText(holder.itemView .getContext(),"FF  F",Toast.LENGTH_SHORT).show();
            }
        }));
    }
    
    @Override
    public int getItemCount() {
        return strings.size();
    }
    
    
     static class ViewHolder extends RecyclerView.ViewHolder {
         TextView textView;
         RecyclerView recyclerView;
        public ViewHolder(final View view) {
            super(view);
            textView = (TextView) view.findViewById(R.id.textView);
             recyclerView = (RecyclerView)view. findViewById(R.id.recyclerView);
    
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(view.getContext(),"FFF",Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }
    }
    

    而 ChildAdapter 是

     public class MyChildAdapter extends RecyclerView.Adapter<MyChildAdapter.ViewHolder> {
    ArrayList<String> strings;
    static setOnClick setOnClick;
    public MyChildAdapter(ArrayList<String> strings, setOnClick setOnClick) {
        this.strings=strings;
        this.setOnClick = setOnClick;
    }
    
    @Override
    public  ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter, parent, false);
        view.setLayoutParams(new ViewGroup.LayoutParams(100,100));
        return new ViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
         holder.textView.setText(strings.get(position));
    }
    
    @Override
    public int getItemCount() {
        return strings.size();
    }
    
    
     static class ViewHolder extends RecyclerView.ViewHolder {
         TextView textView;
    
        public ViewHolder(View view) {
            super(view);
            textView = (TextView) view.findViewById(R.id.textView);
          /*  view.setClickable(false);
            view.setFocusable(false);
            view.setEnabled(false);*/
          view.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  setOnClick.setOnClick();
                  }
               });
            }
        }
    }
    

    接口是

    interface   setOnClick{
    void  setOnClick();
    }
    

    adapter.xml 布局是

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="false">
    <TextView
        android:id="@+id/textView"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:background="#fff"
        android:padding="10dp"
        android:textSize="30dp"
        android:clickable="false"
        />
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_height="match_parent"
            android:layout_width="100dp"
    
           />
    </LinearLayout>
    

    【讨论】:

    • 能否给我一些代码示例或任何有用的链接。
    【解决方案3】:

    如果你点击了 Parent recyclerView 中的某个项目,则获取一个静态变量并将其设置为 false。现在使用这个标志

    如果(父)

    {

    //设置视图的监听器

    }

    现在没有为您的子 recyclerview 设置任何侦听器来响应

    【讨论】:

    • 没有为子recyclerview设置任何listner。
    • @user2566484 因为您对父子和子使用相同的适配器,所以在通过 itemView.setOnClickListener(new View.OnClickListener()) 的代码时会自动设置子的列表器跨度>
    • 对于孩子我有不同的适配器。
    【解决方案4】:

    尝试:

    viewHolder.someInnerRecyclerView.suppressLayout(true);
    viewHolder.someInnerRecyclerView.setFocusable(false);
    viewHolder.someInnerRecyclerView.setClickable(false);
    

    【讨论】:

      【解决方案5】:

      使用它来禁用用户交互

      mRecyclerView.suppressLayout(true)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 2017-02-18
        • 1970-01-01
        相关资源
        最近更新 更多