android值将适配器传递给片段

时间:2016-12-10 12:32:01

标签: android android-fragments android-recyclerview recycler-adapter

我正在开发一个用于显示图像和文本的应用程序。单击该项目时,它将转到另一个片段。列表显示是正确的,但是当我点击该项目时,它不会转到片段。我正在使用Recycler adapter来列出项目。代码如下所示。

public class MyRecyclerAdapter extends RecyclerView.Adapter < MyRecyclerAdapter.MyViewHolder > {

 String categoryId;

 private List < NewsFeeds > feedsList;
 private Context context;
 private LayoutInflater inflater;

 public MyRecyclerAdapter(Context context, List < NewsFeeds > feedsList) {

  this.context = context;
  this.feedsList = feedsList;
  inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

 @Override
 public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

  View rootView = inflater.inflate(R.layout.singleitem_recyclerview_categories, parent, false);
  return new MyViewHolder(rootView);
 }

 @Override
 public void onBindViewHolder(MyViewHolder holder, int position) {
  NewsFeeds feeds = feedsList.get(position);
  //Pass the values of feeds object to Views
  holder.title.setText(feeds.getName());
  //holder.categoryId.setText(feeds.getCategory_id());
  categoryId = feeds.getCategory_id();
  Log.d("LOGTAG", "id : " + categoryId);
  holder.imageview.setImageUrl(feeds.getImgURL(), NetworkController.getInstance(context).getImageLoader());

  Log.d("LOGTAG", "feeds.getFeedName():" + feeds.getName());
 }

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

 public class MyViewHolder extends RecyclerView.ViewHolder {

  private TextView title;
  private NetworkImageView imageview;
  private CardView cardView;


  public MyViewHolder(View itemView) {
   super(itemView);
   title = (TextView) itemView.findViewById(R.id.title_view);
   //categoryId = (TextView) itemView.findViewById(R.id.content_view);
   // Volley's NetworkImageView which will load Image from URL
   imageview = (NetworkImageView) itemView.findViewById(R.id.thumbnail);
   cardView = (CardView) itemView.findViewById(R.id.card_view);

   cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     //Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();



     // I want to send values to SubCategoryFragment and start SubCategoryFragment
     Bundle args = new Bundle();
     args.putString("category_id", categoryId);
     //set Fragmentclass Arguments
     SubCategoryFragment fragobj = new SubCategoryFragment();
     fragobj.setArguments(args);

     Log.d("LOGTAG", categoryId);
     Log.d("LOGTAG", "clicked");



     //newInstance(categoryId);



    }
   });




  }


 }


}

我想将值发送到SubCategoryFragment并启动SubCategoryFragment。

我的SubCategoryFragment代码

public class SubCategoryFragment extends Fragment {

 public SubCategoryFragment() {
  // Required empty public constructor
 }

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


 }

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
  Bundle savedInstanceState) {
  View rootView = inflater.inflate(R.layout.fragment_sub_category, container, false);
  //Bundle bundle = this.getArguments();


  Bundle args = getArguments();
  //String categoryId = args.getString("index");

  String categoryId = getArguments().getString("category_id");
  //String categoryId = getArguments().getString("category_id");
  TextView textView = (TextView) rootView.findViewById(R.id.label);
  textView.setText(categoryId);



  // Inflate the layout for this fragment
  return rootView;
 }

 @Override
 public void onAttach(Activity activity) {
  super.onAttach(activity);
 }

 @Override
 public void onDetach() {
  super.onDetach();
 }
}

请帮帮我

4 个答案:

答案 0 :(得分:3)

从适配器发送数据意图为:

Fragment fragment = new tasks();
FragmentManager fragmentManager = context.getSupportFragmentManager(); // this is basically context of the class
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Bundle bundle=new Bundle();
bundle.putString("name", "From Adapter"); //key and value
//set Fragmentclass Arguments
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.content_frame, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

并在Fragment onCreateView方法中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    String strtext=getArguments().getString("name"); //fetching value by key 
    return inflater.inflate(R.layout.fragment, container, false);
}

答案 1 :(得分:2)

Fragment fragment = new tasks(); FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.content_frame, fragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit();

R.id.content_frame

使用您的片段

更改<?xml version="1.0"?> <configuration> <appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/> </appSettings> <system.web> <compilation debug="true" targetFramework="4.5"/> <httpRuntime targetFramework="4.5"/> <httpModules> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"/> </httpModules> </system.web> <system.serviceModel> <services> <service name="ServiceLayer.TeamManagementService" behaviorConfiguration="GetDataBehavior"> <endpoint address="" binding="webHttpBinding" contract="ServiceLayer.ITeamManagementService" behaviorConfiguration="GetDataEndpointBehavior"></endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior name="GetDataBehavior"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="GetDataEndpointBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> <protocolMapping> <add binding="basicHttpsBinding" scheme="https"/> </protocolMapping> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"> <remove name="ApplicationInsightsWebTracking"/> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler"/> </modules> <directoryBrowse enabled="true"/> <validation validateIntegratedModeConfiguration="false"/> </system.webServer> </configuration>

答案 2 :(得分:0)

您在onClick方法中犯了一个错误。

如果要将一个片段转到其他片段,则必须使用FragmentTransaction.class对片段进行事务处理 请查看以下代码。

修改

 SecondFragment fragment = new SecondFragment();  
     FragmentManager fragmentManager = currentfragment.getFragmentManager();
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.add(R.id.content_frame, fragment);
        fragmentTransaction.hide(currentfragment)    fragmentTransaction.addToBackStack(currentfragment.getclass().getsimplename());
            fragmentTransaction.commit();

修改

将下面的代码放在您的RecyclerViewAdapter方法onBindViewHolder上。

holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();
            // I want to send values to SubCategoryFragment and start SubCategoryFragment
            Bundle args = new Bundle();
            args.putString("category_id", categoryId);
            //set Fragmentclass Arguments
            SubCategoryFragment fragobj = new SubCategoryFragment();
            fragobj.setArguments(args);
            FragmentManager fragmentManager = currentfragment.getFragmentManager(); 
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.add(R.id.content_frame, fragobj);
            fragmentTransaction.hide(currentfragment);
      fragmentTransaction.addToBackStack(currentfragment.getclass().getsimplename());
            fragmentTransaction.commit();


            //newInstance(categoryId);



        }
    });

编辑

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {

    String categoryId;

    private List<NewsFeeds> feedsList;
    private Context context;
    private LayoutInflater inflater;
    private Fragment currentFragment;

    public MyRecyclerAdapter(Context context, List<NewsFeeds> feedsList, final Fragment currentFragment) {

        this.context = context;
        this.feedsList = feedsList;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.currentFragment = currentFragment;
    }

    @Override
    public MyRecyclerAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View rootView = inflater.inflate(R.layout.singleitem_recyclerview_categories, parent, false);
        return new MyViewHolder(rootView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        NewsFeeds feeds = feedsList.get(position);
        //Pass the values of feeds object to Views
        holder.title.setText(feeds.getName());
        //holder.categoryId.setText(feeds.getCategory_id());


        holder.title.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();
                // I want to send values to SubCategoryFragment and start SubCategoryFragment
                Bundle args = new Bundle();
                args.putString("category_id", categoryId);
                //set Fragmentclass Arguments
                SubCategoryFragment fragobj = new SubCategoryFragment();
                fragobj.setArguments(args);
                FragmentManager fragmentManager = currentfragment.getFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.add(R.id.content_frame, fragobj);
                fragmentTransaction.hide(currentfragment);
                fragmentTransaction.addToBackStack(currentfragment.getclass().getsimplename());
                fragmentTransaction.commit();


                //newInstance(categoryId);


            }
        });

    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView title;

        public MyViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.title_view);
        }


    }


}

答案 3 :(得分:0)

用此替换你的onclick监听器。

cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     //Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();



     // I want to send values to SubCategoryFragment and start SubCategoryFragment
     Bundle args = new Bundle();
     args.putString("category_id", categoryId);
     //set Fragmentclass Arguments
     SubCategoryFragment fragobj = new SubCategoryFragment();
     fragobj.setArguments(args);

     Log.d("LOGTAG", categoryId);
     Log.d("LOGTAG", "clicked");
     //put this in your code
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction =         fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.SubCategoryFragment, fragobj);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();


     //newInstance(categoryId);



    }
   });