пользовательский вид Нажмите слушателей, не работает для текущей вкладки - PullRequest
1 голос
/ 11 октября 2019

Я сделал добавление и удаление вкладок, с настраиваемым видом вкладок, который работает нормально. У меня одинаковое представление для всех вкладок, добавленных в viewpager. У меня есть прослушиватели щелчка для некоторого представления в макете, загруженного в viewpager. Но обработчик щелчков работал на последней добавленной вкладке, а не на других вкладках.

Активность

public class Test extends BaseActivity implements View.OnClickListener {
    private TextView flatRateTextView, timeMaterialTextView,
            totalWorkOrderValueTextView;
    private LinearLayout bidTimeMaterialParentLayout, bidTaxTotalParentLayout;
    boolean isFlatRateClicked, isTimeMaterialClicked;
    private ViewPager pager = null;
    private MainPagerAdapter pagerAdapter = null;
    TabLayout tabLayout;
    int i;

    private void initViews() {
        i++;
        pagerAdapter = new MainPagerAdapter();
        pager = (ViewPager) findViewById(R.id.viewpager);
        pager.setAdapter(pagerAdapter);
        appendViewToViewPager(0);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setSelectedTabIndicator(null);
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabLayout.getLayoutParams();
        params.setMargins(widthSpace, widthSpace, widthSpace, 0);
        tabLayout.setLayoutParams(params);
        // tabLayout.setC(v0);
        tabLayout.setupWithViewPager(pager);
        setupTabIcons();
        //Dynamic job Bit & Material Start
        TextView totalWorkOrderTextView = findViewById(R.id.totalWorkOrderTextView);
        totalWorkOrderValueTextView = findViewById(R.id.totalWorkOrderValueTextView);
        TextView addJobTextView = findViewById(R.id.addJobTextView);
        TextView submitTextView = findViewById(R.id.submitTextView);
        submitTextView.setOnClickListener(this);
        addJobTextView.setOnClickListener(this);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);

        //  ... do other initialization, such as create an ActionBar ...
        initViews();

        tabLayout.addOnTabSelectedListener(
                new TabLayout.ViewPagerOnTabSelectedListener(pager) {
                    @Override
                    public void onTabSelected(TabLayout.Tab tab) {
                        super.onTabSelected(tab);
                        //  updateTabs();
                        int numTab = tab.getPosition();
                        Log.e("numTab >", numTab + "");
                        pager.setCurrentItem(numTab);

                    }
                });

    }

    private void setupTabIcons() {


        for (int j = 0; j < i; j++) {
            Log.e("j val>>", j + "");
            View rootView = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.job_dynamic_header_layout, null);
            TextView tabOne = rootView.findViewById(R.id.jobHeaderTextView);
            int tmp = j + 1;
            tabOne.setText("Job" + tmp);
            ImageView closeImageView = rootView.findViewById(R.id.closeImageView);
            closeImageView.setId(tmp);
            closeImageView.setOnClickListener(onClickListener);
            tabLayout.getTabAt(j).setCustomView(rootView);
        }
    }

    View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                default:
                    int tabIdToRemove = v.getId();
                    tabIdToRemove = tabIdToRemove - 1;
                    if (tabIdToRemove < 1) {
                        Toast.makeText(Test.this, "Couldn't remove first tab", Toast.LENGTH_SHORT).show();
                    } else {
                        i--;
                        Toast.makeText(Test.this, "Removed tab" + tabIdToRemove, Toast.LENGTH_SHORT).show();
                        pagerAdapter.removeView(pager, tabIdToRemove);
                        pagerAdapter.notifyDataSetChanged();
                        setupTabIcons();
                    }
                    break;

            }
        }
    };


    private void appendViewToViewPager(int position) {
        LayoutInflater inflater = Test.this.getLayoutInflater();
        NestedScrollView v = (NestedScrollView) inflater.inflate(R.layout.vendor_submit_bit_view_pager_layout, null);
        flatRateTextView = v.findViewById(R.id.flatRateTextView);
        timeMaterialTextView = v.findViewById(R.id.timeMaterialTextView);
        bidTimeMaterialParentLayout = v.findViewById(R.id.bidTimeMaterialParentLayout);
        bidTaxTotalParentLayout = v.findViewById(R.id.bidTaxTotalParentLayout);
        flatRateTextView.setTag(position);
        timeMaterialTextView.setTag(position);

        flatRateTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                isFlatRateClicked = true;
                isTimeMaterialClicked = false;
                bidTimeMaterialParentLayout.setVisibility(View.GONE);
                bidTaxTotalParentLayout.setVisibility(View.VISIBLE);
                flatRateTextView.setBackground(ContextCompat.getDrawable(Test.this, R.drawable.bottom_red_line));
                timeMaterialTextView.setBackground(null);
            }
        });
        timeMaterialTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                isFlatRateClicked = false;
                isTimeMaterialClicked = true;
                totalWorkOrderValueTextView.setText("$0");
                bidTimeMaterialParentLayout.setVisibility(View.VISIBLE);
                bidTaxTotalParentLayout.setVisibility(View.GONE);
                timeMaterialTextView.setBackground(ContextCompat.getDrawable(Test.this, R.drawable.bottom_red_line));
                flatRateTextView.setBackground(null);
            }
        });


        pagerAdapter.addView(v, position);
        pagerAdapter.notifyDataSetChanged();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.backImageView:
                Intent newIntent = new Intent(Test.this, VendorHomeActivity.class);
                startActivity(newIntent);
                break;
 case R.id.addJobTextView:
                i++;

                int tmp = i - 1;
                appendViewToViewPager(tmp);
                setupTabIcons();
                break;
            case R.id.submitTextView:
                break;
        }
    }
}

test.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white_color"
    android:fitsSystemWindows="true">


    <RelativeLayout

        android:layout_width="match_parent"
        android:layout_height="wrap_content">


        <RelativeLayout
            android:id="@+id/dynamicJobLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@+id/layoutTotalWorkOrder"
          >


            <android.support.design.widget.AppBarLayout
                android:id="@+id/layoutTab"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">


                <android.support.design.widget.TabLayout
                    android:id="@+id/tabs"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/custom_tab_layout_height"
                    android:background="@android:color/transparent"
                    android:state_selected="false"
                    app:tabBackground="@drawable/job_tab_selector"
                    app:tabGravity="fill"
                    app:tabMode="scrollable" />
            </android.support.design.widget.AppBarLayout>

            <android.support.v4.view.ViewPager
                android:id="@+id/viewpager"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/white_color"

                />


        </RelativeLayout>

        <LinearLayout
            android:id="@+id/layoutTotalWorkOrder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@+id/layBottom"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/totalWorkOrderTextView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center|end"
                android:text="@string/total_work_order_cost"
                android:textColor="@color/dark_grey_color"
                android:textSize="@dimen/text_size_16"
                />

            <TextView
                android:id="@+id/totalWorkOrderValueTextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="$0"
                android:textColor="@color/red_color"
                android:textSize="@dimen/text_size_16"
                />

        </LinearLayout>

        <LinearLayout
            android:id="@+id/layBottom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:layout_alignParentBottom="true"

            android:orientation="horizontal">

            <TextView
                android:id="@+id/addJobTextView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/grey_cornor_stroke_bg"
                android:gravity="center"
                android:text="@string/add_job_label"
                android:textColor="@color/dark_grey_color"
                android:textSize="@dimen/text_size_14"
               />


            <TextView
                android:id="@+id/submitTextView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/corner_5_dp_red_bg"
                android:gravity="center"
                android:text="@string/submit_label"
                android:textColor="@color/white_color"
                android:textSize="@dimen/text_size_14"
               />

        </LinearLayout>
    </RelativeLayout>


    <android.support.design.widget.NavigationView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start">

        <include layout="@layout/vendor_job_work_order_view" />

    </android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

job_dynamic_header_layout.xml

<?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="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/headerLay"
    android:gravity="center_vertical"
   >

    <TextView
        android:id="@+id/jobHeaderTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="@dimen/text_size_14"
        android:textColor="@color/white_color"
        android:text="Job"/>

    <ImageView
        android:id="@+id/closeImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/white_cross_icon"/>

</LinearLayout>

vendor_submit_bit_view_pager_layout.xml

<?xml version="1.0" encoding="utf-8"?>

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    android:id="@+id/jobDescDetailLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/custom_tab_layout_height"
    android:background="@drawable/light_blue_white_cornor_bg"
    android:orientation="vertical">


    <LinearLayout
        android:id="@+id/flatRateParentLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/flatRateTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/bottom_red_line"
            android:gravity="center"
            android:text="@string/flat_rate_label"
            android:textColor="@color/black_color"
            android:textSize="@dimen/text_size_small_12" />

        <TextView
            android:id="@+id/timeMaterialTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:singleLine="true"
            android:text="@string/time_material_label"
            android:textColor="@color/dark_grey_color"
            android:textSize="@dimen/text_size_small_12" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/bidTaxTotalParentLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/white_10_cornor_bg"
        android:orientation="vertical">


    </LinearLayout>

    <LinearLayout
        android:id="@+id/bidTimeMaterialParentLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/white_10_cornor_bg"
        android:orientation="vertical">


        <LinearLayout
            android:id="@+id/dynamicMaterialLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/materialLabelTextView"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/materials_label"
                android:textColor="@color/dark_grey_color"
                android:textSize="@dimen/text_size_16" />

            <TextView
                android:id="@+id/addMaterialTextView"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:text="@string/add_material_label"
                android:textColor="@color/red_color"
                android:textSize="@dimen/text_size_16" />

        </LinearLayout>
    </LinearLayout>


</LinearLayout>

1 Ответ

3 голосов
/ 15 октября 2019

Проблема скорее в архитектуре, чем в коде. Ответ на ваш вопрос довольно прост, однако.

Вы используете глобальные переменные для View s на каждой странице вашего ViewPager. Это означает, что каждый раз, когда добавляется новая страница - старые переменные стираются и меняются вместе с новыми с новой страницы.

Я бы предложил вам создать глобальные переменные в вашем адаптере MainPagerAdapter для хранения связанных страницпросмотрите ссылки и прикрепите всех слушателей в методе instantiateItem() вашего адаптера. Чтобы передать слушатель вашему адаптеру из Activity, вы можете использовать какой-нибудь интерфейс, например

interface MyClickListener{

  void onClick(int pagePosition);

}

public class MainPagerAdapter extends PagerAdapter {

    private TextView timeMaterialTextView;

    MyClickListener listener;

    ...

    public MainPagerAdapter(MyClickListener listener) {
        this.listener = listener;
    }

    ...

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view = ...;
        timeMaterialTextView = view.findViewById(R.id.timeMaterialTextView);
        timeMaterialTextView.setOnClickListener(
        new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ...
                listener.onClick(position);
                ...
            }
        });
        container.addView(view);
        return view;
    }

    ...

}

public class Test extends BaseActivity implements MyClickListener {

   private void initViews() {
        ...
        pagerAdapter = new MainPagerAdapter(this);
        ...
   }

   void onClick(int position) {
    /// do all the stuff you need to do here
   }

}

Это не точный ответ, скорее он показывает, как должна выглядеть ваша структура кода, но, надеюсь, выПойду дальше.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...