![](/img/trans.png)
[英]How do I load into a specific Fragment / Viewpager with an onClick method?
[英]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.