1. 程式人生 > 其它 >RecyclerView巢狀內+外item 實現點選事件

RecyclerView巢狀內+外item 實現點選事件

技術標籤:java

專案中一個功能需要RecyclerView巢狀如下圖

(圖片來自網路)

內部Adapter 核心程式碼

  holder.btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(con, "刪除", Toast.LENGTH_SHORT).show();
                lisner.onCilck(position);
            }
        });

        rv2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return false;
            }
        });
public class TestKActivity extends AppCompatActivity {

    private RecyclerView rvone;
    private TestAdapter testAdapter;
    private List<String> datas= new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_k);
        rvone=(RecyclerView)findViewById(R.id.rv_1);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
         testAdapter = new TestAdapter(this);
        rvone.setAdapter(testAdapter);
        rvone.setLayoutManager(linearLayoutManager);
        inidata();
        testAdapter.setUpdate(datas);
        testAdapter.setLisner(new TestAdapter.Lisner() {
            @Override
            public void onCilck(int postion) {
                Toast.makeText(TestKActivity.this, "=aaaaaaaaa="+postion, Toast.LENGTH_SHORT).show();
                testAdapter.removes(postion);
            }
        });


    }

    private void inidata() {
        for(int i=0;i<10;i++){
           datas.add("-A-"+i);
        }
    }
}
//外層的Adapter
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.MyViewHodewr> {
    private Context con;
    private List<String> datas = new ArrayList<>();
    private List<String> datab = new ArrayList<>();
    private TestTwoAdapter testTwoAdapter;
    private RecyclerView rv2;

    public TestAdapter(TestKActivity testKActivity) {
        this.con = testKActivity;
        for (int i = 0; i < 4; i++) {
            datab.add("-B-" + i);
        }
    }

    @NonNull
    @Override
    public MyViewHodewr onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_a, parent, false);
        return new MyViewHodewr(inflate);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHodewr holder, int position) {
        //攔截內部的recyView
//        holder.itemView.setOnTouchListener(new View.OnTouchListener() {
//            @Override
//            public boolean onTouch(View v, MotionEvent event) {
//                return rv2.onTouchEvent(event);
//            }
//        });


        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //    Toast.makeText(con, "Aaa", Toast.LENGTH_SHORT).show();
                if (lisner != null) {
                    lisner.onCilck(position);
                }

            }
        });


       // holder.tv.setText(datas.get(position));

        testTwoAdapter = new TestTwoAdapter();
        rv2 = holder.rv2;
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(con);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(con, 3);
        linearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);
        rv2.setLayoutManager(gridLayoutManager);
        rv2.setAdapter(testTwoAdapter);
        testTwoAdapter.setUpdate(datab);
        testTwoAdapter.setLisner(new TestTwoAdapter.Lisners() {
            @Override
            public void onCilck(int postions) {

                Toast.makeText(con, "bbb" + postions, Toast.LENGTH_SHORT).show();
            }
        });
        holder.btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(con, "刪除", Toast.LENGTH_SHORT).show();
                lisner.onCilck(position);
            }
        });

        rv2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return false;
            }
        });
    }

    @Override
    public int getItemCount() {
        return datas.size() > 0 ? datas.size() : 0;
    }

    public void setUpdate(List<String> datass) {
        this.datas.addAll(datass);
    }

    public void removes(int postion) {
        if(this.datas!=null){
              datas.remove(postion);
              notifyDataSetChanged();

        }
    }

    class MyViewHodewr extends RecyclerView.ViewHolder {

        private  Button btn;
        private TextView tv;
        private RecyclerView rv2;

        public MyViewHodewr(@NonNull View itemView) {
            super(itemView);
            rv2 = (RecyclerView) itemView.findViewById(R.id.rv_2);
            tv = (TextView) itemView.findViewById(R.id.tv);

                    btn= (Button) itemView.findViewById(R.id.detele);
        }
    }

    public void setLisner(Lisner lisner) {
        this.lisner = lisner;
    }

    private Lisner lisner = null;

    interface Lisner {
        public void onCilck(int postion);
    }
}

內部Item的 Adapter

public class TestTwoAdapter extends RecyclerView.Adapter<TestTwoAdapter.MyViewHoldler> {
    private List<String> datas= new ArrayList<>();

    @NonNull
    @Override
    public MyViewHoldler onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_two, parent, false);
        return new  MyViewHoldler(inflate);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHoldler holder, int position) {
            holder.name.setText(datas.get(position));

            holder.itemView.setOnClickListener(new View.OnClickListener() {


                private int positio;

                @Override
                public void onClick(View v) {
                   if( lisner!=null){
                       lisner.onCilck(position);
                      this.positio= position;
                   }
                }
            });

    }




    @Override
    public int getItemCount() {
        return datas.size()>0?datas.size():0;
    }

    public void setUpdate(List<String> datasS) {
         datas.addAll(datasS);
    }

    class MyViewHoldler extends RecyclerView.ViewHolder{


        private TextView title;
        private  TextView name;
        private  ImageView image;

        public MyViewHoldler(@NonNull View itemView) {
           super(itemView);
           image= (ImageView)itemView.findViewById(R.id.image_on);
           name= (TextView)itemView.findViewById(R.id.name_1);
            title= (TextView)itemView.findViewById(R.id.title_1);
       }
   }

    public void setLisner(Lisners lisner) {
        this.lisner = lisner;
    }

    private  Lisners lisner=null;
   interface  Lisners{
        public void onCilck(int postion);
   }
}

主佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".recyView.TestKActivity">

    <androidx.recyclerview.widget.RecyclerView
         android:layout_width="match_parent"
    android:layout_height="match_parent"
        android:id="@+id/rv_1"
        />
</LinearLayout>

外層

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="match_parent"
        android:id="@+id/detele"
        android:layout_height="30dp"
        android:text="刪除"
        />
     <androidx.recyclerview.widget.RecyclerView
          android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:id="@+id/rv_2"
         />
</LinearLayout>

內層

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"

    >


    <ImageView
        android:id="@+id/image_on"
        android:layout_width="90dp"
        android:layout_height="match_parent"
        android:src="@drawable/ic_launcher_background" />

    <LinearLayout
        android:layout_toRightOf="@id/image_on"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/name_1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="helloskdhsjkdh"
             />
        <TextView
            android:id="@+id/title_1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="helloskdhsjkdh"
            />
    </LinearLayout>

</RelativeLayout>