【问题标题】:RecyclerView not replacing detail pane with fragment on item clickRecyclerView 没有在项目单击时用片段替换详细信息窗格
【发布时间】:2019-03-31 05:59:51
【问题描述】:

每次我单击平板电脑上的回收站视图项时,它都会打开一个活动,而不是用片段替换详细信息窗格。

以下代码行是我用来检测详细信息窗格是否存在的代码:

mTwoPane = Objects.requireNonNull(getActivity()).findViewById(R.id.detail_container) != null;

关于放置这行代码的正确位置有什么想法吗?

活动 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.widget.Toolbar
        android:id="@+id/masterToolbar"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize"
        >


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

            <TextView
                android:id="@+id/md_toolbar_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                style="@android:style/TextAppearance.Material.Widget.ActionBar.Title"/>
        </LinearLayout>

    </android.widget.Toolbar>


    <RelativeLayout
        android:id="@+id/master_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</LinearLayout>

sw600dp 活动 XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    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.widget.Toolbar
        android:id="@+id/masterToolbar"
        android:layout_width="0dp"
        android:layout_height="?actionBarSize"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/detailBackgroundToolbar"
        app:layout_constraintHorizontal_weight="2"
        app:layout_constraintTop_toTopOf="parent">


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

            <TextView
                android:id="@+id/md_toolbar_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                style="@android:style/TextAppearance.Material.Widget.ActionBar.Title"/>
        </LinearLayout>

    </android.widget.Toolbar>


    <RelativeLayout
        android:id="@+id/master_container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintHorizontal_weight="2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/divider"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/masterToolbar" />

    <View
        android:id="@+id/divider"
        android:layout_width="1dp"
        android:layout_height="0dp"
        android:background="?attr/dividerColor"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/masterToolbar"
        app:layout_constraintTop_toBottomOf="@+id/masterToolbar" />

    <android.widget.Toolbar
        android:id="@+id/detailBackgroundToolbar"
        android:layout_width="0dp"
        android:layout_height="?actionBarSize"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_weight="3"
        app:layout_constraintStart_toEndOf="@+id/masterToolbar"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.v7.widget.CardView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_margin="4dp"
        app:cardCornerRadius="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/divider"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent="0.5">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <include layout="@layout/toolbar_dualline"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

            <FrameLayout
                android:id="@+id/detail_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

        </LinearLayout>

    </android.support.v7.widget.CardView>

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/divider"
        app:layout_constraintTop_toBottomOf="@+id/detailBackgroundToolbar" />

</android.support.constraint.ConstraintLayout>

片段类

public class MyFragment extends Fragment {

    public MyFragment() {}

    List<Product> wcList;

    RecyclerView mRecyclerView;

    /**
     * Whether or not the activity is in two-pane mode, i.e. running on a tablet device.
     */
    public boolean mTwoPane;

    public static MyFragment newInstance() {
        return new MyFragment();
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_main, container, false);
        mTwoPane = Objects.requireNonNull(getActivity()).findViewById(R.id.detail_container) != null;

        mRecyclerView = view.findViewById(R.id.recyclerView_list);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        mRecyclerView.addItemDecoration(new DividerItemDecoration(Objects.requireNonNull(getContext()), LinearLayout.VERTICAL));

        myList = new ArrayList<>();

        String[] items = getResources().getStringArray(R.array.product_names);
        String[] itemDescriptions = getResources().getStringArray(R.array.product_descriptions);
        for (int n = 0; n < items.length; n++){
            Product desserts = new Product();
            desserts.setProductName(items[n]);
            wdessertsc.setProductDescriptions(itemDescriptions[n]);
            myList.add(desserts);
        }

        MyListAdapter listAdapter = new MyListAdapter(getActivity(), myList);

        mRecyclerView.setAdapter(listAdapter);

        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        mTwoPane = Objects.requireNonNull(getActivity()).findViewById(R.id.detail_container) != null;

        super.onActivityCreated(savedInstanceState);
    }
}

适配器类

    public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.MyViewHolder> {
        public boolean mTwoPane;

        private Context mCtx;

        private List<Product> myList;

        public MyListAdapter(Context mCtx, List<Product> myList) {
            this.mCtx = mCtx;
            this.myList = myList;
        }

        @NonNull
        @Override
        public MyListAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(mCtx);
            View view = inflater.inflate(R.layout.listitem_dualline, parent,false);
            return new MyListAdapter.MyViewHolder(view);
        }

        @Override
        public void onBindViewHolder(@NonNull final MyListAdapter.MyViewHolder holder, final int position) {
            Log.d(TAG, "onBindViewHolder: called.");

            final Product product = myList.get(holder.getAdapterPosition());

            holder.textviewTitle.setText(product.getProductName());
            holder.textviewSubtitle.setText(product.getPRoductDescription());


            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mTwoPane) {
                        Fragment newFragment;
                        if (product.getStationName().equals(v.getResources().getString(R.string.product_1))) {
                            newFragment = new FragmentProduct1();
                        } else {
                            newFragment = new FragmentProdcut2();
                        }
                        MyActivity activity = (MyActivity) v.getContext();
                        FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
                        transaction.replace(R.id.detail_container, newFragment);
                        transaction.commit();
                    } else {
                        Intent intent;
                        if (product.getStationName().equals(v.getResources().getString(R.string.product_1))) {
                            intent = new Intent(v.getContext(), Product1Activity.class);
                        } else {
                            intent = new Intent(v.getContext(), Product2Activity.class);
                        }
                        mCtx.startActivity(intent);
                    }
                }
            });
        }

        @Override
        public int getItemCount() {
            return myList.size();
        }

        class MyViewHolder extends RecyclerView.ViewHolder {
            RelativeLayout relativeLayout;
            TextView textviewTitle, textviewSubtitle;

            StationViewHolder(View itemView) {
                super(itemView);

                mTwoPane = itemView.findViewById(R.id.detail_container) != null;

                relativeLayout = itemView.findViewById(R.id.listitem_relativelayout);
                textviewTitle = itemView.findViewById(R.id.listitem_title);
                textviewSubtitle = itemView.findViewById(R.id.listitem_subtitle);
            }
    }
}

【问题讨论】:

  • 我可以看看你的xml文件吗?
  • mTwoPane 即将来到false
  • 尝试反转 onitemclicklistener 中的 if 条件语句。我的意思是在之前写活动语句,在 else 部分写片段语句并尝试。

标签: java android listview arraylist master-detail


【解决方案1】:

来自您的视图持有者的这一行mTwoPane = itemView.findViewById(R.id.detail_container) != null; 将始终为false

为什么?

因为您的 detail_container 不是您的视图持有者的项目容器的一部分,所以 itemView 将始终为您的视图返回 null。而是将您的布尔标志从您的片段传递给您的适配器!

【讨论】:

  • 通过它的正确方法是什么?我以前见过几种不同的方法
  • 您可以通过构造函数将其设置为您的适配器。类似:MyListAdapter(Context mCtx, List&lt;Product&gt; myList, boolean twoPane) 然后设置你的变量,不要忘记从视图持有者中删除行。
  • itemView in this.mTwoPane = itemView.findViewById(R.id.detail_container) != null; 将需要更改为其他内容,知道这里应该使用什么吗?
  • 您可以删除该行,因为您按照我的建议从片段中传递了标志mTwoPane
【解决方案2】:

我认为您正在使用 recyclerview 项目 xml 检查项目二

mTwoPane = itemView.findViewById(R.id.detail_container) != null;

您可以在构建 recyclerview 适配器时检查并从活动内容视图本身保存它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多