2017-01-03 2 views
2

Я пытаюсь добавить намерение от моего текущего фрагмента к другому фрагменту. Для этого я добавил OnclickListener поверх ImageButton на карте.getSupportFragmentManager() не работает в моем классе адаптера?

Но он не работает должным образом, я не смог найти ошибку в своем коде.

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(); 
     } 
    } 
} 
+0

Вы называете '' Намерение .why '' Фрагмент одной странице –

+1

Прежде всего, это будет лучше для обработки фрагмента транзакции в главном page.2nd, как @IntelliJAmiya сказал, почему Вы начинаете новая активность и новая транзакция фрагмента вместе? –

+0

Я действительно забыл удалить часть намерения ... Я только что обновил код прямо сейчас –

ответ

1

Это лучше передать FragmentManager в конструктор адаптера от вашей активности (или фрагмента, если you'r использование)

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(); 
+0

его хорошо работает ... –

3
FragmentManager fm = new CardExpandFragmentmFragment() 
       FragmentTransaction ft = fm.beginTransaction(); 
       ft.replace(R.id.cardExpand, fm, "fragment_card"); 
       ft.commit(); 
+0

cant метод разрешения getSupportFragmentManager –

+1

@IntelliJAmiya dude 'getSupportFragmentManager' или' getFragmentManager' - это методы из 'FragmentActivity' или' Activity', которые недоступны в 'context'. – kId

+0

@Kaushik благодарит за меня –

4

Просто передайте вашу активность в адаптер и использовать

activity.getSupportFragmentManager() 

Но его не очень хорошая идея. Используйте прослушиватель в адаптере и вызовите его в действии, где вы устанавливаете адаптер.

1

Переместить onClick действиями к соответствующему Fragment/Activity, где adapter используется с использованием interface. Лучше не выполнять Fragment transactions в adapter classes.

Как вы видите:

itemView.setOnClickListener(this);

Эта строка кода указывает, что нет конкретных onClickListener к image button. Установленный вами номер click listener предназначен для всего элемента.

1

Просто не значение контекста Присвоить в ViewHolder. Вы уже передаете значение контекста из конструктора.

public ViewHolder(View itemView, ImageButton imButton) { 

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

    } 

Вам просто нужно сделать свой контекст в AppcompatActivity. Просто убедитесь, что вы используете AppCompatActivity вместо Activity и передаете значение Context из Activity в конструкторе адаптера. Чем только он может бросить

@Override 
    public void onClick(View v) { 

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