簡體   English   中英

我如何從適配器類的onClick方法中加載片段

[英]How do i load fragments out of onClick method in an adapter class

到目前為止,我一直在處理片段。 基本上我想做的就是能夠根據所選選項的位置將數據加載到片段中。 到目前為止,我所有的嘗試都失敗了。

據我所知,生病可能需要一個溝通者接口來幫助該職位。 另外,我不相信我可以從適配器類訪問片段,而必須在main方法中完成。

我該怎么辦?

這是我的適配器類:

public class RouteAdapter extends RecyclerView.Adapter<RouteAdapter.ViewHolder> {
private static List<Routes> routes;
private static List<Routes.stations> stations;
private AdapterView.OnItemClickListener listener;
Communicator comm;


public RouteAdapter(List<Routes> routesList) {
    routes = routesList;
    stations = new ArrayList<>();
    for (Routes routes : routesList) {
        stations.addAll(routes.getmStationsList());
    }
}

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    public Button BtnRouteName;
    public CardView cardView;
    public TextView TvStationName;
    private OnItemClickListener listener;

    public ViewHolder(View itemView, OnItemClickListener listener) {
        super(itemView);
        TvStationName = (TextView) itemView.findViewById(R.id.textView);
        cardView = (CardView) itemView.findViewById(R.id.cv);
        //cardView.setOnClickListener(this);
        final Context context = itemView.getContext();
        BtnRouteName = (Button) itemView.findViewById(R.id.route_name);
        BtnRouteName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = getAdapterPosition();
                Routes s = routes.get(position);
                Routes.stations og = stations.get(position);
                if (listener != null)
                    listener.onItemClick(TvStationName.getText().toString(); //ERROR

            }
        });
    }
}

@Override
public RouteAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.routes_card, parent, false);
    //ViewHolder viewHolder = new ViewHolder(v);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(RouteAdapter.ViewHolder holder, int position) {

    Routes rPosition = routes.get(position);

    holder.setOnItemClickListener(listener);  //ERROR
    holder.BtnRouteName.setText(rPosition.getmRouteName());
    holder.cardView.setTag(position);
}

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

public void setOnItemClickListener(OnItemClickListener listener){
    this.listener = (AdapterView.OnItemClickListener) listener;
}

public interface OnItemClickListener{
    public void onItemClick(int position);
}
}

這是我的主要方法:

public class MainActivity extends AppCompatActivity implements Communicator {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Gets the rv from the xml file (activity_main.xml)
    mRecyclerView = (RecyclerView) findViewById(R.id.rv);

    // use this setting to improve performance if you know that changes
    // in content do not change the layout size of the RecyclerView
    mRecyclerView.setHasFixedSize(true);

    // use a linear layout manager
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);

    //This is a test fragment just loads a image nothing to really do w/ the problem
    MainActivityFragment frag = new MainActivityFragment();
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.main_layout, frag, "frag1");
    transaction.commit();

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    loadRV();
}

private void loadRV() {
    TrolleyService trolleyService = TrolleyServiceProvider.createService(TrolleyService.class);
    Call<List<Routes>> call = trolleyService.listRoutes();
    call.enqueue(new Callback<List<Routes>>() {
        @Override
        public void onResponse(Response<List<Routes>> response, Retrofit retrofit) {
            if (response.isSuccess()) {
                mAdapter = new RouteAdapter(response.body());
                mRecyclerView.setAdapter(mAdapter);
            } else {
                Log.d("Oops Something is wrong", response.message());
            }
        }

        @Override
        public void onFailure(Throwable t) {
            Log.d("ERROR", t.getMessage());

        }
    });
}
}

我的嘗試之一(請求):我刪除了大多數嘗試的代碼,但遵循以下幾條原則:主要活動:

    MainActivityFragment frag = new MainActivityFragment();
    FragmentA fragA = new FragmentA(); //Fragments i wanted to add
    FragmentB fragB = new FragmentB(); //Fragments i wanted to add
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.main_layout, frag, "frag1");
    transaction.commit();

     @Override
public void respond(String data) {
    FragmentManager manager = getFragmentManager();
    FragmentB f2 = (FragmentB) manager.findFragmentById(R.id.textView);
    f2.changeText(data); //This was a test to display the first name on list
}

我的溝通者班

public interface Communicator {
public void respond(String data);

}

我的onClick適配器類

@Override
    public void onClick(View v) {
        int position = getAdapterPosition();
        Routes s = routes.get(position);
        Routes.stations og = stations.get(position);
        comm.respond(og.getStationsName());
    }

將recyclerView放在片段中。

我假設您能夠獲得適配器的位置。 將recyclerview放在一個片段RV中,它的響應將在片段RVValues中看到。 您使用一個稱為PassRVValues的接口

RV片段中的代碼:

public class RV extends Fragment{
   int RVposition;
   PassRVValues passRVValues;
//
 your code for recyclerview and other things
//
 RVposition = position_value_obtained;
 passRVValues.sendToOtherFragment(RVposition);

這是該接口的代碼。 制作一個僅具有接口的新Java類。

public interface PassRVValues{
   sendToOtherFragment(int value_from_RVFragment);
}

活動中的代碼

   public class MainActivity implements PassRVValues{
   //
     some code
   //
   @Override
   public void sendToOtherFragment(int use_value_from_RVFragment){
   //
    Do something with data if you want
   //
   RVvalues Frag = (RVValues)getFragmentManager().findFragmentById(R.id.rvvalues);
   Frag.ShowDataBasedOnPositionInRV(something_based_from_any_process_in_sendToOtherFragment_Method);
   }

現在查看RVValues片段中的代碼

public class RVValues extends Fragment{
    //again any codes//
    public void ShowDataBasedOnPositionInRV(int data_based_on_RV_position){
   //do something//
}

這是以最簡單的方式實現片段間通信的方式。 希望這可以幫助! 干杯!

不使用界面的最簡單方法

這是您的片段類

public class RV extends Fragment{

// your code

}

您的通話活動

public class MainActivity{

// some code

public void setFragment(//params you want to pass){
        FragmentManager fm = getSupportFragmentManager();
        android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.ll_container, new RV).commit();
}

}

您的適配器

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

    Context context;

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

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        public ViewHolder(View itemView) {
            super(itemView);

            button //your button

            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                     ((MainActivity)context).setFragment(//params you want to pass);
                }
            });

        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM