java - 如何将数据从 fragment 传递到适配器

标签 java android android-fragments

让我快速解释一下我的代码结构,我有一个带有动态 fragment 的动态选项卡布局。这些选项卡是从 json 响应中获取的,每个选项卡都有一个动态 fragment ,其中的回收器 View 也由 json 响应填充。

我正在尝试将所选选项卡的 id 传递给回收器 View 的适配器

<强>1。 TransactionsFragment(创建选项卡布局的位置)

 for(int i=0;i<array.length();i++) {

                                //getting wallet object from json array
                                JSONObject userWallets=array.getJSONObject(i);

                                tab.addTab(tab.newTab().setText(userWallets.getString("wallet_name")));
                                walletID.add(userWallets.getInt("id"));
                            }

                            TransactionsPagerAdapter adapter = new TransactionsPagerAdapter
                                    (getChildFragmentManager(), tab.getTabCount(), walletID); //the data i need to pass is the walletID
                            viewPager.setAdapter(adapter);
                            viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab));
                            adapter.notifyDataSetChanged();

<强>2。 TransactionsPagerAdapter(控制选项卡的适配器)

public class TransactionsPagerAdapter extends FragmentStatePagerAdapter {
    int mNumOfTabs;
    ArrayList<Integer> walletID;

    public TransactionsPagerAdapter(FragmentManager fm, int NumOfTabs, ArrayList<Integer> walletID) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        this.mNumOfTabs = NumOfTabs;
        this.walletID = walletID;
    }

    @Override
     public Fragment getItem(int position) {
    DynamicFragment d = new DynamicFragment();
    Bundle args = new Bundle();
    args.putInt("your_key", walletID.get(position));
    d.setArguments(args);
    return d.newInstance(walletID.get(position));

}

    @Override
    public int getCount() {
        return mNumOfTabs;
    }
    }

<强>3。 DynamicFragment(填充每个选项卡中的回收器 View )

for(int i=0;i<array.length();i++) {

                                //getting wallet object from json array
                                JSONObject userTransactions=array.getJSONObject(i);

                                //adding the wallet to wallet list
                                userTransactionList.add(new Transaction(
                                        userTransactions.getInt("id"),
                                        userTransactions.getInt("wallet_id"),
                                        userTransactions.getDouble("fee"),
                                        userTransactions.getDouble("amount"),
                                        userTransactions.getDouble("from"),
                                        userTransactions.getDouble("to"),
                                        userTransactions.getString("destination_address"),
                                        userTransactions.getString("type"),
                                        userTransactions.getString("created_at")
                                ));
                            }

                            //creating adapter object and setting it to recyclerview
                            TransactionsAdapter adapter = new TransactionsAdapter(getActivity(),childFragmentManager, userTransactionList);
                            mRecyclerView.setAdapter(adapter);
                            swipeRefreshLayout.setRefreshing(false);
                            // stop animating Shimmer and hide the layout
                            mShimmerViewContainer.stopShimmerAnimation();
                            mShimmerViewContainer.setVisibility(View.GONE);
//                            progressDialog.dismiss();
                            adapter.notifyDataSetChanged();

<强>4。 TransactionsAdapter(控制回收器 View 的适配器)

public class TransactionsAdapter extends RecyclerView.Adapter<TransactionsAdapter.DataObjectHolder> {

    private static String TAG = TransactionsAdapter.class.getSimpleName();

    private Context mCtx;
    private FragmentManager fragmentManager;

    private ArrayList<Transaction> userTransactionList;
    private static MyClickListener myClickListener;

    public TransactionsAdapter(Context mCtx, FragmentManager fragmentManager, ArrayList<Transaction> userTransactionList) {
        this.mCtx = mCtx;
        this.fragmentManager = fragmentManager;
        this.userTransactionList = userTransactionList;
    }

    public static class DataObjectHolder extends RecyclerView.ViewHolder {
        TextView transactionamount, transactionstatus, transactionid;
        ImageView transactionicon, pendingicon;

        public DataObjectHolder(View itemView) {
            super(itemView);
            transactionamount = (TextView) itemView.findViewById(R.id.amount);
            transactionstatus = (TextView) itemView.findViewById(R.id.status);
            transactionicon = (ImageView) itemView.findViewById(R.id.tx_icon);
            pendingicon = (ImageView) itemView.findViewById(R.id.img_status);
            transactionid = (TextView) itemView.findViewById(R.id.wallet_id);
        }

    }

        @Override
        public TransactionsAdapter.DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(mCtx).inflate(R.layout.transaction_item, parent, false);
            final TransactionsAdapter.DataObjectHolder dataObjectHolder = new TransactionsAdapter.DataObjectHolder(view);
            return dataObjectHolder;
        }


        @Override
        public void onBindViewHolder(TransactionsAdapter.DataObjectHolder holder, final int position) {

            DecimalFormat formatter = new DecimalFormat("###,###,###,###,###.##");
            formatter.setDecimalSeparatorAlwaysShown(true);
            formatter.setMinimumFractionDigits(2);
            Double doubleBalance = userTransactionList.get(position).getTransactionAmount();
            String numberFormatBalance = formatter.format(doubleBalance);
            holder.transactionstatus.setText(userTransactionList.get(position).getTransactionType());
            holder.transactionamount.setText(String.valueOf("₦ " + numberFormatBalance));
            if ((userTransactionList.get(position).getTransactionType()).equals("send")) {
                holder.transactionicon.setImageResource(R.drawable.ic_communication_call_made);
            } else  {
                holder.transactionicon.setImageResource(R.drawable.ic_communication_call_received);
            }

        }


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

        public interface MyClickListener {
            public void onItemClick(int position, View v);
        }
    }

我需要从 1(TransactionsFragment) 到 4(TransactionsAdapter) 获取 walletID,这可能吗?如果可以的话如何实现,我知道事实上这不能通过 bundle 来完成,因为我们没有创建 Intent

最佳答案

  1. 确保将 walletId 放入 DynamicFragmentArguments
DynamicFragment.newInstance(walletID.get(position))
  • 按照此修改 TransactionsAdapter 的构造函数
  • private Integer walletId;
    
    public TransactionsAdapter(Context mCtx, FragmentManager fragmentManager, ArrayList<Transaction> userTransactionList, Integer walletId) {
            this.mCtx = mCtx;
            this.fragmentManager = fragmentManager;
            this.userTransactionList = userTransactionList;
            this.walletId = walletId;
        }
    
    
    
  • DynamicFragment中,当您初始化TransactionsAdapter时,从fragment的参数中获取walletId
  • Integer walletId = getArguments().getInt("your_key") // your key when you newInstance and put to Bundle
    TransactionsAdapter adapter = new TransactionsAdapter(getActivity(),childFragmentManager, userTransactionList);
    

    最后,您的适配器具有walletId的信息

    关于java - 如何将数据从 fragment 传递到适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62047035/

    相关文章:

    Java 应用程序崩溃

    java - 客户端-服务器聊天应用程序 JAVA

    java - fragment 应该是独立的吗?

    android - 动态更改 ViewPager 中的 fragment 内容

    java - 有什么方法可以不将 'instance of' 与我无法扩展的对象一起使用?

    java - Spring Data Neo4j "No property get found for type"异常

    android - 在 Android 中以编程方式删除色调颜色

    android - 收到fcm通知后自动启动activity?

    android - ListView和行回收问题

    android - TabLayout 指示器卡在选项卡之间,内容消失