简体   繁体   English

如何在RecyclerView.Adapter中实现片段

[英]How to implement a Fragment in RecyclerView.Adapter

Good day How can I call a fragment when the users will click the card inside MyAdapter class. 美好的一天,当用户单击MyAdapter类中的卡时,如何调用片段。 I want to replace view from the adapter. 我想替换适配器中的视图。 I am using recyclerview wants to perform click event using the view from my row layout. 我正在使用recyclerview,希望使用行布局中的视图执行click事件。

Like for example when the user clicks the card it will open a fragment and it will show more data. 例如,当用户单击卡时,它将打开一个片段,并显示更多数据。 Hope you can help me guys. 希望你能帮助我。

This is my main fragment 这是我的主要片段

AccountsFragment AccountsFragment

ReceivableFragment ReceivableFragment

LoanAppFragment LoanAppFragment

Those fragments hold different data. 这些片段保存不同的数据。 when the user clicks the cards inside that fragment it will call another fragment the SLDTLFragment . 当用户单击该片段内的卡时,它将调用另一个片段SLDTLFragment

Btw this MyAdapter.java 顺便说一下这个MyAdapter.java

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

private List<Datas> mDataset;

// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class MyViewHolder extends RecyclerView.ViewHolder {

    public CardView mCardView;
    public TextView account_type;
    public TextView accnt_description;
    public TextView balance_label;
    public TextView account_balance;

    public MyViewHolder(View v) {
        super(v);

        mCardView = (CardView) v.findViewById(R.id.card_view);

        account_type = (TextView) v.findViewById(R.id.lblShareCapital);
        balance_label = (TextView) v.findViewById(R.id.lblAvailableBalance);

        accnt_description = (TextView) v.findViewById(R.id.sl_desc);
        account_balance = (TextView) v.findViewById(R.id.actual_balance);
    }
}
public MyAdapter(List<Datas> myDataset) {
    mDataset = myDataset;
}

// Create new views (invoked by the layout manager)
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,
                                                 int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_item, parent, false);
    // set the view's size, margins, paddings and layout parameters
    MyViewHolder vh = new MyViewHolder(v);
    return vh;
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    //holder.account_type.setText(mDataset[position]);
    Datas datas = mDataset.get(position);
    holder.accnt_description.setText(datas.getSL_DESC());
    holder.account_balance.setText(datas.getACTUAL_BALANCE());
    holder.mCardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
         // String sl_desc = mDataset.get(position).getSL_DESC();
         // String actual_balance = mDataset.get(position).getACTUAL_BALANCE();
            String sle = mDataset.get(position).getSLE();
            String slc = mDataset.get(position).getSLC();
            String slt = mDataset.get(position).getSLT();
            String ref_no = mDataset.get(position).getREF();

            Log.d("CardView Clicked", "sle code: " + sle);
            Log.d("CardView Clicked", "slc code: " + slc);
            Log.d("CardView Clicked", "slt code: " + slt);
            Log.d("CardView Clicked", "ref no: "   + ref_no);
        }
    });
}

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

} }

AccountsFragment.java AccountsFragment.java

public class AccountsFragment extends Fragment {
private SQLiteHandler db;
    public AccountsFragment() {
        // Required empty public constructor
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_accounts, container, false);
        RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.rv_recycler_view);
        rv.setHasFixedSize(true);
        SQLiteHandler db = new SQLiteHandler(getActivity());
        MyAdapter adapter = new MyAdapter(db.getUserSLDetails());
        rv.setAdapter(adapter);

        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        rv.setLayoutManager(llm);

        return rootView;
    }
}

ReceivableFragment.java ReceivableFragment.java

    public class ReceivableFragment extends Fragment {


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


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_receivable, container, false);
        RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.rv_recycler_view);
        rv.setHasFixedSize(true);
        SQLiteHandler db = new SQLiteHandler(getActivity());
        MyAdapter adapter = new MyAdapter(db.getUserSLARLoans());
        rv.setAdapter(adapter);

        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        rv.setLayoutManager(llm);

        return rootView;
    }

}

MainActivity.java MainActivity.java

public class MainActivity extends AppCompatActivity {

    private TextView nav_header_name;
    private TextView nav_header_email;

    public TextView txtLogOut;

    private SQLiteHandler db;
    private SessionManager session;

    private Timer timer;
    private Toolbar toolbar;

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

        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        //Will replace the activity_main.xml to relativelayout_for_fragment.xml
        if (savedInstanceState == null) {
            AccountsFragment f1= new AccountsFragment();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.add(R.id.relativelayout_for_fragment, f1);// relativelayout_for_fragment is inside the content_main.xml
            fragmentTransaction.commit();
        }

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        View header=navigationView.getHeaderView(0);
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {

                txtLogOut = (TextView) findViewById(R.id.nav_logout_menu);

                int id = item.getItemId();

                if (id == R.id.nav_deposit) {
                    // Handle the preference  action
                    AccountsFragment accounts= new AccountsFragment();
                    FragmentManager manager= getSupportFragmentManager();
                    manager.beginTransaction()
                            .replace(R.id.relativelayout_for_fragment, accounts)
                            .commit();

                    Toast.makeText(MainActivity.this, "Deposit Accounts", Toast.LENGTH_SHORT).show();

                }else if (id == R.id.nav_receivable) {
                    // Handle the Loan application();
                    ReceivableFragment receivable= new ReceivableFragment();
                    FragmentManager manager= getSupportFragmentManager();
                    manager.beginTransaction()
                            .replace(R.id.relativelayout_for_fragment, receivable)
                            .commit();

                    Toast.makeText(MainActivity.this, "AR and Loan Accounts", Toast.LENGTH_SHORT).show();

                }else if (id == R.id.nav_apply_loan_menu) {
                    // Handle the Loan application();
                    LoanAppFragment loan_app= new LoanAppFragment();
                    FragmentManager manager= getSupportFragmentManager();
                    manager.beginTransaction()
                            .replace(R.id.relativelayout_for_fragment, loan_app)
                            .commit();

                    Toast.makeText(MainActivity.this, "This module is under developement", Toast.LENGTH_SHORT).show();
                }else if (id == R.id.nav_logout_menu) {
                    // Handle the About action
                    logoutUser();
                    //Toast.makeText(MainActivity.this, "successfully Logout", Toast.LENGTH_LONG).show();
                }

                DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
                drawer.closeDrawer(GravityCompat.START);
                return true;
            }
        });

        nav_header_name = (TextView) header.findViewById(R.id.nav_name);
        nav_header_email = (TextView) header.findViewById(R.id.nav_email);

        // SqLite database handler
        db = new SQLiteHandler(getApplicationContext());

        // session manager
        session = new SessionManager(getApplicationContext());

        if (!session.isLoggedIn()) {
            logoutUser();
        }

        //Fetching user details from SQLite
        HashMap<String, String> user = db.getUserDetails();

        String username = user.get("username");
        String email = user.get("email");
        //Displaying the user info in nav_header_main.xml
        nav_header_name.setText(username);
        nav_header_email.setText(email);

    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
    /**
     * Logging out the user. Will set isLoggedIn flag to false in shared
     * preferences Clears the user data from sqlite users table
     * */
    private void logoutUser() {
        session.setLogin(false);

        db.deleteUsers();
        db.deleteUserSLDTL();

        // Launching the login activity
        Intent intent = new Intent(MainActivity.this, LoginActivity.class);
        startActivity(intent);
        finish();
    }

    @Override
    protected void onPause() {
        super.onPause();

        timer = new Timer();
        Log.i("Main", "Invoking logout timer");
        LogOutTimerTask logoutTimeTask = new LogOutTimerTask();
        timer.schedule(logoutTimeTask, 30000); // auto logout in 30secs inactivity
        Log.i("Main", "Log out user due to inactivity");
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (timer != null) {
            timer.cancel();
            Log.i("Main", "cancel timer");
            timer = null;
        }
    }

    private class LogOutTimerTask extends TimerTask {

        @Override
        public void run() {
            session.setLogin(false);

            db.deleteUsers();
            db.deleteUserSLDTL();
            //redirect user to login screen
            Intent i = new Intent(MainActivity.this, LoginActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);
            finish();
        }
    }
}

You need to use Listener/Callback pattern to inform your Activity or Fragment where the Adapter is used. 您需要使用侦听器/回调模式来通知您的活动或片段使用适配器的位置。 Do not directly call a Fragment or activity inside of the Adapter because it will defeat the purpose of the Adapter. 不要直接在适配器内部调用Fragment或activity,因为它会破坏适配器的用途。 Adapter should only be used to show the data. 适配器只能用于显示数据。

To implement the pattern, first create the interface and constructor to set the listener in your Adapter: 要实现此模式,请首先创建接口和构造函数以在Adapter中设置侦听器:

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

  ...

  private List<Datas> mDataset;

  private ClickListener mListener;

  public interface ClickListener {
    void onItemClicked(YourData yourData);
  }

  public MyAdapter(List<Datas> myDataset, ClickListener listener) {
    mDataset = myDataset;
    mListener = listener;
  }

  ...
}

Second, whenever there is a click of the item data, tell the listener with the following code in your Adapter: 其次,每当单击项目数据时,在适配器中将以下代码告诉侦听器:

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    ...
    holder.mCardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
         // String sl_desc = mDataset.get(position).getSL_DESC();
         // String actual_balance = mDataset.get(position).getACTUAL_BALANCE();
         //   String sle = mDataset.get(position).getSLE();
         //   String slc = mDataset.get(position).getSLC();
         //   String slt = mDataset.get(position).getSLT();
         //   String ref_no = mDataset.get(position).getREF();
         // Simplify the above to a pojo. We assume the pojo is YourData     
         YourData data = new YourData();
         // set the data from above.

         mListener.onItemClicked(yourData);
    });
}

Third, you need to set the listener in your Activity/Fragment which using the Adapter with: 第三,您需要在“活动/片段”中设置监听器,并使用以下适配器:

 MyAdapter.ClickListener listener = new MyAdapter.ClickListener() {
   @Override 
   public void onItemClicked(YourData yourData) {
     // Do something with the data here.
   }
 };

 MyAdapter adapter = new MyAdapter(db.getUserSLARLoans(), listener);
 rv.setAdapter(adapter);

You need to handle the data in your listener inside the onItemClicked() method above. 您需要在上面的onItemClicked()方法内处理侦听器中的数据。

try to pass getFragmentManager using constructor and then replace the view with container view in your item row. 尝试使用构造函数传递getFragmentManager ,然后在项目行中将视图替换为容器视图。

//constructor
public MyAdapter(FragmentManager fragment, List<Datas> myDataset) {
    mDataset = myDataset;
    mFragment  = fragment;
}

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

    public CardView mCardView;
    public TextView account_type;
    public TextView accnt_description;
    public TextView balance_label;
    public TextView account_balance;

    public MyViewHolder(View v){
            super(v);

            mCardView = (CardView) v.findViewById(R.id.card_view);

            account_type = (TextView) v.findViewById(R.id.lblShareCapital);
            balance_label = (TextView) v.findViewById(R.id.lblAvailableBalance);

            accnt_description = (TextView) v.findViewById(R.id.sl_desc);
            account_balance = (TextView) v.findViewById(R.id.actual_balance);
            mCardView.setOnClickListener(this)
        }
    @Override
    public void onClick(View view){
        mFragment.beginTransaction().replace(R.id.containerRow,new MyFragment()).commit();
    }
}

//note this is not tested code.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM