1. 程式人生 > >事件分發 解決header子控制元件與父控制元件的衝突

事件分發 解決header子控制元件與父控制元件的衝突

在這裡插入圖片描述
父控制元件listview佈局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/List_View"></ListView>
</android.support.constraint.ConstraintLayout>

listview對應的item

<?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">
    <TextView
        android:id="@+id/listView_Name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:layout_gravity="center_horizontal"
        android:text="heheda"/>
</LinearLayout>

MainActivity

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import com.example.day13_event.adapter.MyAdapter;
import com.example.day13_event.adapter.MyPagerAdapter;
import com.example.day13_event.weigt.MyViewPager;

import java.util.ArrayList;

public class CTDemoActivity extends AppCompatActivity {
    private ListView List_View;
    private ArrayList<String> mList = new ArrayList<>();
    private View mHeaderView;
    private MyViewPager mViewPager;
    private MyAdapter mAdapter;
    private ArrayList<View> mPagerList = new ArrayList<>();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ctdemo);
        initData();
        initHeaderView();
        initView();
        mAdapter = new MyAdapter(mList, CTDemoActivity.this);
        List_View.setAdapter(mAdapter);
    }
    private void initHeaderView() {
        mHeaderView = getLayoutInflater().inflate(R.layout.header_view, null);
        mViewPager = mHeaderView.findViewById(R.id.ViewPager);
        for (int i = 0; i < 5; i++) {
            View view = getLayoutInflater().inflate(R.layout.pager_view, null);
            mPagerList.add(view);
        }
        mViewPager.setParent((ViewGroup) mViewPager.getParent());
        mViewPager.setAdapter(new MyPagerAdapter(mPagerList));
    }

    private void initData() {
        for (int i = 0; i < 30; i++) {
            mList.add("啦啦啦" + i);
        }
    }
    private void initView() {
        List_View = (ListView) findViewById(R.id.List_View);
        List_View.addHeaderView(mHeaderView);
    }
}

ListView對應介面卡

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.example.day13_event.R;

import java.util.ArrayList;

public class MyAdapter extends BaseAdapter {
    private ArrayList<String> mList;
    private Context mContext;

    public MyAdapter(ArrayList<String> mList, Context mContext) {
        this.mList = mList;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Holder holder = null;
        if (convertView == null) {
            convertView = View.inflate(mContext, R.layout.listview_item, null);
            holder = new Holder();
            holder.mTv = convertView.findViewById(R.id.listView_Name);
            convertView.setTag(holder);
        } else {
            holder = (Holder) convertView.getTag();
        }
        holder.mTv.setText(mList.get(position));
        return convertView;
    }

    class Holder {
        private TextView mTv;
    }
}

MyViewPager優化後自己導控制元件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
<com.example.day13_event.weigt.MyViewPager
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:id="@+id/ViewPager"></com.example.day13_event.weigt.MyViewPager>
</LinearLayout>

上方圖片佈局

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

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_launcher" />
</LinearLayout>

MyViewPager消除viewpage和listview之間的影響

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;

public class MyViewPager extends ViewPager {
    private ViewGroup parent;
    public MyViewPager(@NonNull Context context) {
        super(context);
    }

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

    public void setParent(ViewGroup parent) {
        this.parent = parent;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
       if (parent!=null){
           parent.requestDisallowInterceptTouchEvent(true);
       }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (parent!=null){
            parent.requestDisallowInterceptTouchEvent(true);
        }
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (parent!=null){
            parent.requestDisallowInterceptTouchEvent(true);
        }
        return super.onTouchEvent(ev);
    }
}

ViewPager優化

package com.example.day13_event.adapter;

import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;

public class MyPagerAdapter extends PagerAdapter {
    private ArrayList<View> mList;

    public MyPagerAdapter(ArrayList<View> mList) {
        this.mList = mList;
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view == o;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        container.addView(mList.get(position));
        return mList.get(position);
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(mList.get(position));
    }
}