【问题标题】:getSupportFragmentManager() is not working in my adapter class?getSupportFragmentManager() 在我的适配器类中不起作用?
【发布时间】:2017-01-03 10:35:53
【问题描述】:

我正在尝试将当前片段中的意图添加到另一个片段。为此,我在卡片中的 ImageButton 上添加了一个 OnclickListener。

但它不能正常工作,我在我的代码中找不到错误。

package com.example.kgb.homescreen.myaccount;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;

import com.example.kgb.R;
import com.example.kgb.components.UpdatedTextView;

import java.util.ArrayList;


public class MyAccountsCardAdapter extends RecyclerView.Adapter<MyAccountsCardAdapter.ViewHolder> {

    private static Context context;

    public MyAccountsCardAdapter(Context context) {
        this.context=context;
    }

    private ArrayList<MyAccountsCard>cardArrayList;
    public MyAccountsCardAdapter(ArrayList<MyAccountsCard> cardData) {
        this.cardArrayList=cardData;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView= LayoutInflater.from(parent.getContext()).inflate(R.layout.accounts_card_layout, parent, false);
        ImageButton imButton = (ImageButton) itemView.findViewById(R.id.shareButton);
        return new ViewHolder(itemView,imButton);
    }

    @Override
    public void onBindViewHolder(MyAccountsCardAdapter.ViewHolder holder, int position ){
        //holder.accountBalance.setTextColor(Color.parseColor("#000000"));

        Log.d("ABBB","haiii" + holder.accountType.getText());
        if(holder.accountType.getText().equals("Savings"))
        {
            holder.accountBalance.setTextColor(Color.parseColor("#000000"));
        }
        holder.accountNo.setText(cardArrayList.get(position).getAccountNo());
        holder.scheme.setText(cardArrayList.get(position).getScheme());
        holder.accountType.setText(cardArrayList.get(position).getAccountType());
        holder.accountBalance.setText(cardArrayList.get(position).getAccountBalance());
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public ImageButton iButton;
        UpdatedTextView accountNo=(UpdatedTextView) itemView.findViewById(R.id.acc_no);
        UpdatedTextView scheme=(UpdatedTextView) itemView.findViewById(R.id.acc_scheme);
        UpdatedTextView accountType=(UpdatedTextView) itemView.findViewById(R.id.acc_type);
        UpdatedTextView accountBalance=(UpdatedTextView) itemView.findViewById(R.id.acc_bal);
        public ViewHolder(View itemView, ImageButton imButton) {

            super(itemView);
            itemView.setOnClickListener(this);
            iButton = imButton;
            context = itemView.getContext();

        }

        @Override
        public void onClick(View v) {

            Fragment mFragment = new CardExpandFragment();
            context.getSupportFragmentManager().beginTransaction().replace(R.id.cardExpand, mFragment).commit();
        }
    }
}

【问题讨论】:

  • 你打电话给Intent 。为什么Fragment 同一页
  • 首先,在您的主页中处理片段事务会更好。第二,正如@IntelliJAmiya 所说,您为什么要一起开始一个新活动和一个新片段事务?
  • 我实际上忘记删除意图部分...我现在刚刚更新了代码

标签: java android android-intent


【解决方案1】:

最好将FragmentManager 从您的活动(如果您正在使用,则从片段)传递给您的适配器构造函数

FragmentManager fragmentManager;
public MyAccountsCardAdapter(Context context ,ArrayList<MyAccountsCard> cardData ,FragmentManager fragmentManager) {
    this.cardArrayList=cardData;
    this.fragmentManager = fragmentManager;
}

然后调用

Fragment mFragment = new CardExpandFragment();
fragmentManager .beginTransaction().replace(R.id.cardExpand, mFragment).commit();

【讨论】:

    【解决方案2】:

    只需将您的活动传递给您的适配器并使用

    activity.getSupportFragmentManager()
    

    但这不是一个好主意。在适配器中使用侦听器并在您设置适配器的活动中调用它。

    【讨论】:

      【解决方案3】:

      对于那些使用 kotlin 的人,你可以简单地做这样的事情

      val dialog = IntervModifFragment()//The fragment that u want to open for example
             val ft = (context as AppCompatActivity).supportFragmentManager.beginTransaction()
              dialog.show(ft, ContentValues.TAG) 
      

      【讨论】:

        【解决方案4】:

        只是不要在 ViewHolder 中分配上下文值。您已经从构造函数传递上下文值。

           public ViewHolder(View itemView, ImageButton imButton) {
        
                super(itemView);
                itemView.setOnClickListener(this);
                iButton = imButton;
                context = itemView.getContext();
        
            }
        

        您只需要将您的 Context 转换为 AppcompatActivity。只需确保您使用的是 AppCompatActivity 而不是 Activity 并在适配器的构造函数中从 Activity 传递上下文值。不仅仅是它可以施放

            @Override
            public void onClick(View v) {
        
                Fragment mFragment = new CardExpandFragment();
                ((AppCompatActivity)context).getSupportFragmentManager().beginTransaction().replace(R.id.cardExpand, mFragment).commit();
            }
        

        【讨论】:

          【解决方案5】:
          FragmentManager fm = new CardExpandFragmentmFragment ()
                         FragmentTransaction ft = fm.beginTransaction();
                         ft.replace(R.id.cardExpand, fm, "fragment_card");
                         ft.commit();
          

          【讨论】:

          • @IntelliJAmiya dude getSupportFragmentManagergetFragmentManager 是来自 FragmentActivityActivity 的方法,这些方法在 Context 中不可用。
          【解决方案6】:

          使用interfaceonClick 操作移动到正在使用adapter 的相应Fragment/Activity。最好不要在adapter classes中执行Fragment transactions

          如你所见:

          itemView.setOnClickListener(this);

          此代码行表示image button 没有特定的onClickListener。您设置的click listener 是针对整个项目的。

          【讨论】:

            猜你喜欢
            • 2021-04-07
            • 2016-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-12
            • 1970-01-01
            相关资源
            最近更新 更多