【问题标题】:Open Fragment OnClick on Recyclerview item from ApI从 ApI 打开 Fragment OnClick on Recyclerview 项目
【发布时间】:2016-10-25 15:04:04
【问题描述】:

我正在使用 AQuery 从 recycleview 中的 API 获取数据,但现在我想从 API onclick 上的 recyclerview 项目打开片段,那么我该如何实现这一点。 我想和 Instagram 应用程序一样,比如在主页上单击名称时,我们会在另一个片段上获取用户的所有详细信息。

【问题讨论】:

  • 只需使用 FragmentTransaction。但是从适配器类打开片段不是推荐的方式,因此您需要为此实现监听器。

标签: android


【解决方案1】:
//CouponFragment.java
public class CouponFragment extends Fragment implements CouponList.OnActionCompleted{
    private RecyclerView recyclerView;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        recyclerView = new RecyclerView(getActivity());
        return recyclerView;
    }
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        ArrayList<String> coupons = new ArrayList<>();
        coupons.add("Tamil");
        coupons.add("English");
        coupons.add("Malay");
        coupons.add("Chinese");
        recyclerView.setAdapter(new CouponList(coupons,CouponFragment.this));
    }
    @Override
    public void OnClick(Coupon coupon){
        //new fragment
        CouponDetails couponDetails  = new CouponDetails();
        FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.home_container, couponDetails);
        //R.id.home_container  is your FrameLayout id
        transaction.addToBackStack("couponDetails");
        transaction.commit();
    }
}

cardview_coupon_info.xml

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/tools"
    android:foreground="?android:attr/selectableItemBackground"
    android:transitionName="coupon_info_card"
    android:id="@+id/coupon_info_card"
    android:clickable="true"
    android:layout_margin="@dimen/item_margin"
    card_view:cardElevation="6dp"
    card_view:cardCornerRadius="4dp">

    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:id="@+id/coupon_description"
            android:gravity="start"
            android:layout_margin="4dp" />

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

CouponList.java(Recyclerview 适配器)

public class CouponList extends RecyclerView.Adapter<CouponList.ViewHolder> {
    private ArrayList<String> coupons;
    private OnActionCompleted callback;

    public CouponList(ArrayList<String> coupons,OnActionCompleted callback)
    {
        this.coupons = coupons;
        this.callback = callback;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_coupon_info,parent,false));
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.description.setText(coupons.get(position);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView description;
        public ViewHolder(View itemView) {
            super(itemView);
            description = (TextView) itemView.findViewById(R.id.coupon_description);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            String coupon = coupons.get(getAdapterPosition());
            callback.OnClick(coupon);
        }

    }

    public interface OnActionCompleted {
        public void OnClick(Coupon coupon);
    }
}

您也可以在 Activity 中使用它,以便在回收站视图项中轻松实现多个小部件点击 :)

【讨论】:

    【解决方案2】:

    在您的回收站视图项 onClick 中执行以下操作。

    FragmentManager fm = getFragmentManager();// If you're in an activity.
    FragmentManager fm = getSupportFragmentManager();// If you're already inside another fragment
    YourFragment yfObj = new YourFragment();
    fm.beginTransaction().replace(R.id.fragmentContainer, yfObj).commit();
    

    这里的 fm 是 FragmentManager 对象,只有你可以进行片段事务,例如加载一个新片段。

    yfObj 是要加载的片段类的对象。

    R.id.fragmentContainer 是您在 XML 文件中声明的容器布局的 ID,您要在其中加载片段。

    希望这会有所帮助!

    【讨论】:

    • 我必须将 OnClickListner 放在 RecyclerViewAdapter 或 MainFragment 类中?以及将 API 放在 MainFragment 的什么位置?
    • 您可以在您的适配器中创建您的回收站视图项目布局的根布局对象并在那里处理点击。
    • 对于 API,我猜你可以在活动/片段中调用 API 并从那里的 API 加载数据。然后将该数据提供给适配器类以加载回收器视图。
    猜你喜欢
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多