簡體   English   中英

將 Fragment 中 RecyclerView 的數據傳遞到另一個 Fragment

[英]Pass data from RecyclerView in Fragment to another Fragment

我有應用與RecycleView和點擊一行之后,我需要打開另一個RecycleView在另一個Fragment在此基礎上在點擊的行中第一RecycleView數據。 我有它正在工作的應用程序,現在我想要DrawerMenuFragments ,但我不知道該怎么做。 我是 Android 新手,我所知道的一切都來自教程。

基本活動

package cz.revelio.mhdapp;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.widget.Toast;

public class BaseActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    private DrawerLayout drawer;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

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

    drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

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

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                new ZapisFragment()).commit();
        navigationView.setCheckedItem(R.id.nav_message);
    }
}

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {

        case R.id.nav_chat:
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new ZapFragment()).commit();
            break;
        case R.id.nav_profile:
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new SeznamFragment()).commit();
            break;
        case R.id.nav_message:
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new ZapisFragment()).commit();
            break;
        case R.id.nav_share:
            Toast.makeText(this, "Share", Toast.LENGTH_SHORT).show();
            break;
        case R.id.nav_send:
            Toast.makeText(this, "Send", Toast.LENGTH_SHORT).show();
            break;
    }

    drawer.closeDrawer(GravityCompat.START);
    return true;
}

@Override
public void onBackPressed() {
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}
}

BaseActivity我可以調用SeznamFragment其中第一個RecyclerView

   package cz.revelio.mhdapp;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;


public class SeznamFragment extends Fragment {
    RecyclerView recyclerView;
    DatabaseHelper mDatabaseHelper;
    TextView info;
    Context context;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v =  inflater.inflate(R.layout.fragment_seznam, container, false);
    info = (TextView) v.findViewById(R.id.info_count_in_dash);
    recyclerView= (RecyclerView) v.findViewById(R.id.recyclerview);
    mDatabaseHelper = new DatabaseHelper(context);
    int vsechyZaznamy = mDatabaseHelper.getCountAllLogs();
    int unikatniZaznamy = mDatabaseHelper.getCountUniqueLogs();
    info.setText(vsechyZaznamy+" záznamů, z toho "+unikatniZaznamy+" unikátních.");
    getData();
    return v;
}

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

}
public void getData(){
    List<String> dataZaznamy = mDatabaseHelper.getAllLogs();
    String[] zaznamy = new String[dataZaznamy.size()];
    zaznamy = dataZaznamy.toArray(zaznamy);
    recyclerView.setLayoutManager(new LinearLayoutManager(context));
    recyclerView.setAdapter(new Adapter(context,zaznamy));
}


}

RecycleViewRecycleView

package cz.revelio.mhdapp;


import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.widget.RecyclerView;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    Context context;
    String[] items;
    public Adapter(Context context, String[] items){
        this.context=context;
        this.items=items;
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View row = inflater.inflate(R.layout.costume_row, viewGroup, false);
    Item item=new Item(row);
    return item;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
    String text = items[position];
    final String casti[] = text.split(",");
    ((Item)viewHolder).itemName.setText(casti[0]);
    ((Item)viewHolder).itemCount.setText(casti[2]+"x");
    ((Item)viewHolder).itemLast.setText("Naposledy zapsáno:  "+casti[3]);
    ((Item) viewHolder).lay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Toast.makeText(context, "OnClick Called on position "+position+" a lince "+ casti[0], Toast.LENGTH_SHORT).show();
         Fragment fragment = new VehicleFragment();
         Bundle b = new Bundle();
         b.putString("vehicle_id", casti[0]);
         fragment.setArguments(b);

         //android.support.v4.app.FragmentManager fragmentManager = get
          /*  Intent intent = new Intent(context, VehicleList.class);
            intent.putExtra("vehicle_id", casti[0]);
            context.startActivity(intent);*/
        }
    });
    ((Item) viewHolder).lay.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            //Toast.makeText(context, "OnLongClick Called on position "+position, Toast.LENGTH_SHORT).show();
            return true;
        }
    });
}



@Override
public int getItemCount() {
    return items.length;
}
public class Item extends RecyclerView.ViewHolder {
    TextView itemName;
    TextView itemCount;
    TextView itemLast;
    ConstraintLayout lay;

    public Item(View itemView){
        super(itemView);
        itemName= (TextView) itemView.findViewById(R.id.item_name);
        itemCount= (TextView) itemView.findViewById(R.id.item_count);
        itemLast= (TextView) itemView.findViewById(R.id.item_last);
        lay = (ConstraintLayout) itemView.findViewById(R.id.item_rr);
    }
}


}

VehicleFragment在哪里是第二個RecyclerView並且我需要來自SeznamFragment.java數據:

package cz.revelio.mhdapp;


import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;


public class VehicleFragment  extends Fragment {

    private static final String TAG = "LineList";
    RecyclerView recyclerView;
    DatabaseHelper mDatabaseHelper;
    Context context;
    String vehicle_id;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_seznam, container, false);

    }

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = getContext();
    mDatabaseHelper = new DatabaseHelper(context);

    //getIncomingIntent();
}

/*private void getIncomingIntent(){

    if(getActivity().getIntent().hasExtra("vehicle_id")){
        String vehicle_id =  getActivity().getIntent().getStringExtra("vehicle_id");
        getData(vehicle_id);
    }
}*/

public void getData(String id_vehicle){
    List<String> dataZaznamy = mDatabaseHelper.getAllLogsByVehId(id_vehicle);
    String[] zaznamy = new String[dataZaznamy.size()];
    zaznamy = dataZaznamy.toArray(zaznamy);
    recyclerView.setLayoutManager(new LinearLayoutManager(context));
    recyclerView.setAdapter(new AdapterVehicle(context,zaznamy));
    }

}

第二個RecyclerView AdapterVehicle

package cz.revelio.mhdapp;



import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
import android.support.v7.widget.RecyclerView;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

public class AdapterVehicle extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    DatabaseHelper mDatabaseHelper;
    Context context;
    String[] items;

    public AdapterVehicle(Context context, String[] items){
        this.context=context;
        this.items=items;

    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View row = inflater.inflate(R.layout.costume_row_veh, viewGroup, false);
        Item item=new Item(row);
        return item;
    }
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
    mDatabaseHelper = new DatabaseHelper(context);
    String text = items[position];
    final String casti[] = text.split(",");
    if(casti[5].equals("true")) {
        ((Item) viewHolder).itemName.setText("Jízda linkou " + casti[1]);
    }else{
        ((Item) viewHolder).itemName.setText("Linka " + casti[1]);
    }
    ((Item)viewHolder).itemCount.setText(casti[2]);
    ((Item)viewHolder).itemLast.setText(casti[3]);
    ((Item) viewHolder).lay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Toast.makeText(context, "OnClick Called on position "+position+" a lince "+ casti[0], Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(context, VehicleEdit.class);
            intent.putExtra("vehicle_id", casti[0]);
            intent.putExtra("line", casti[1]);
            intent.putExtra("datum", casti[2]);
            intent.putExtra("cas", casti[3]);
            intent.putExtra("jedu", casti[5]);
            intent.putExtra("id", casti[4]);
            context.startActivity(intent);
        }
    });
    ((Item) viewHolder).lay.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            //Toast.makeText(context, "OnLongClick Called on position "+position, Toast.LENGTH_SHORT).show();
            //pass the 'context' here
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
            alertDialog.setTitle("Smazat záznam");
            alertDialog.setMessage("Chcete záznam smazat?");
            alertDialog.setPositiveButton("Ano", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    Toast.makeText(context, "Záznam vozidla "+casti[0]+" na lince "+casti[1]+" byl smazán.", Toast.LENGTH_SHORT).show();
                    mDatabaseHelper.removeItem(casti[4]);
                    notifyDataSetChanged();
                    Intent intent = new Intent(context, SeznamFragment.class);
                    context.startActivity(intent);
                }
            });
            alertDialog.setNegativeButton("Ne", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

            AlertDialog dialog = alertDialog.create();
            dialog.show();
            return true;
        }
    });
}

@Override
public int getItemCount() {
    return items.length;
}
public class Item extends RecyclerView.ViewHolder {
    TextView itemName;
    TextView itemCount;
    TextView itemLast;
    ConstraintLayout lay;

    public Item(View itemView){
        super(itemView);
        itemName= (TextView) itemView.findViewById(R.id.item_name_veh);
        itemCount= (TextView) itemView.findViewById(R.id.item_count_veh);
        itemLast= (TextView) itemView.findViewById(R.id.item_last_veh);
            lay = (ConstraintLayout) itemView.findViewById(R.id.item_rr_veh);
        }
    }
}

我嘗試了 StackOvreflow 的另一種解決方案,但對我來說沒有任何效果。

在這里你可以找到我的實際代碼https://drive.google.com/file/d/1W6OzBCjwH4PJkix73woLCHHDBrh26-U1/view?usp=sharing

你可以通過 Bundle :

public static VehicleFragment newInstance(String your_data_if_its_string) {
        VehicleFragment frag = new VehicleFragment();
        Bundle args = new Bundle();
        args.putString(PersonDBFields.ID, person_id);
        frag.setArguments(args);
        return frag;
    }

將它放在您的VehicleFragment ,並使用VehicleFragment.newInstance("yourData"); 或者你可以在你的類中創建一個字段並為它創建一個Setter ,然后在你的新實例中調用setter方法而不是Bundle

你做的一切都是正確的,除非你沒有將它添加到片段管理器,這就是你無法啟動 SecondFragment 的原因。 像這樣做 :

    VehicleFragment frag = new VehicleFragment();
    Bundle args = new Bundle();
    args.putString(PersonDBFields.ID, person_id);
    frag.setArguments(args);
    return frag;

//now add it to the fragment manager.like you are doing in your activity
getFragmentManager().beginTransaction().add(R.id.container, frag).commit();

在新 VehicleFragment 的 onCreateView 中:

//Retrieve the value
String value = getArguments().getString("YourKey");

您必須在適配器類中獲取片段管理器。

   @Override
    public void onClick(View view){
     VehicleFragment vehicleFragment =VehicleFragment.getInstance();
     Bundle b = new Bundle();
     b.putString("vehicle_id", casti[0]);
     vehicleFragment.setArguments(b);
    AppCompatActivity activity = (AppCompatActivity) view.getContext();         
    activity.getSupportFragmentManager().beginTransaction()
   .replace(R.id.fragment_container, 
    myFragment).addToBackStack(null).commit();

 }

最近,Android Jetpack有一些非常好的庫,其中包含ViewModel對象,可以更輕松地管理和存儲數據。 它允許您訪問應用程序中不同活動或片段的數據。 你試試看,希望對你有用

暫無
暫無

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

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