简体   繁体   中英

Disable Touch of inner RecyclerView

I'm new to RecyclerView and I want to implement OnItemClickListner like Listview. To do this I'm using following code.

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  
            }
        });
    }
}

The most simple way is creating own RecyclerView , override onTouchEvent and use it in your XML layout or code.

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;
    }
}

Then you can re-use that widget in other places without any extra logic.

Take a static variable and set it to false if u have clicked some item in the Parent recyclerView. Now using this flag

if(parent)

{

//set the listner for the View

}

Now no listner is set for your child recyclerview to respond

You have to use interface with inner RecycleView Class get it's clickListener into parent RecycleView Class.This will work.

Here is Sample

  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);
    }
}

and Parent Adapter is

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();
                }
            });
        }
    }
}

and ChildAdapter Is

 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();
              }
           });
        }
    }
}

and Interface is

interface   setOnClick{
void  setOnClick();
}

and adapter.xml layout is

<?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>

try:

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

使用它来禁用用户交互

mRecyclerView.suppressLayout(true)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM