簡體   English   中英

單擊 RecyclerView 項時如何從一個片段移動到另一個片段

[英]How to move from one fragment to another fragment on click of a RecyclerView item

我想單擊 RecyclerView 上的一個項目(在列表片段上),然后使用該項目的一些數據轉到詳細信息片段。

我已經知道如何在活動中使用意圖,但我找不到與 RecyclerView 項目有關的示例。

//In first Activity
Intent intent = new Intent();
intent.setClass(this,SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putDouble("height",height);
bundle.putString("sex",sex);
intent.putExtras(bundle);
startActivity(intent);

//In second Activity
Bundle bundle1=this.getIntent().getExtras();
String sex=bundle1.getString("sex");
double height=bundle1.getDouble("height");

我被困在適配器中。 誰能一步一步向我解釋?

謝謝!

我的適配器代碼

public class GPAAdapter extends RecyclerView.Adapter<GPAAdapter.ViewHolder> {
private List<GPAModel> mGPAList;

class ViewHolder extends RecyclerView.ViewHolder {
    TextView lessonNameText;
    TextView lessonCodeText;
    TextView teacherNameText;
    TextView semesterNameText;
    View listView;
    public ViewHolder(View gpaItemView) {
        super(gpaItemView);
        lessonNameText = (TextView) gpaItemView.findViewById(R.id.gpa_lessonName);
        lessonCodeText = (TextView) gpaItemView.findViewById(R.id.gpa_lessonCode);
        teacherNameText = (TextView) gpaItemView.findViewById(R.id.gpa_teacherName);
        semesterNameText = (TextView) gpaItemView.findViewById(R.id.gpa_semesterName);
        listView = gpaItemView;
    }
}
public GPAAdapter(List<GPAModel> dataList) {
    mGPAList = dataList;
}

@Override
public  ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.gpa_item, parent, false);
    final ViewHolder holder = new ViewHolder(view);
    return holder;
}
public void setData(List<GPAModel> viewData) {
    mGPAList.clear();
    mGPAList.addAll(viewData);
    notifyDataSetChanged();
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    GPAModel data = mGPAList.get(position);
    holder.setIsRecyclable(true);
    holder.lessonNameText.setText(data.getLessonName());
    holder.lessonCodeText.setText(data.getLessonCode());
    holder.teacherNameText.setText(data.getTeacherName());
    holder.semesterNameText.setText(data.getSemesterName());

    //save position in itemView with TAG
    holder.itemView.setTag(position);
}
@Override
public int getItemCount() {
    return mGPAList.size();
}

//define interface
public static interface OnItemClickListener {
    void onItemClick(View view , int position);
}
private OnItemClickListener mOnItemClickListener = null;

//Alert: method does not override method from its superclass
@Override
public void onClick(View v) {
    if (mOnItemClickListener != null) {
        //getTag of position
        mOnItemClickListener.onItemClick(v,(int)v.getTag());
    }
}

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

}

我的清單片段

private FragmentManager manager;
private FragmentTransaction ft;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View gpaView = inflater.inflate(R.layout.fragment_gpa, container, false);
    RecyclerView gpaRecyclerView = (RecyclerView) gpaView.findViewById(R.id.gpa_list);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    gpaRecyclerView.setLayoutManager(layoutManager);
    GPAAdapter adapter = new GPAAdapter(getData());
    gpaRecyclerView.setAdapter(adapter);
    return gpaView;

    //how use .setArguments(bundle) in fragment? 
    super.onCreate(savedInstanceState);
    manager = getFragmentManager();

    GPAAdapter.setOnItemClickListener(new OnItemClickListener(){
        @Override
        public void onItemClick(View view , int position){
            Toast.makeText(MainActivity.this, data[position], 600).show();
        }
    });
}

private List<GPAModel> getData() {
}

您可以在列表片段的onItemClick中使用FragmentTransaction替換片段

final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.details, new NewFragmentToReplace(), "NewFragmentTag"); 
ft.commit(); 

在 Recycler.Adapter 上調用 getFragmentManager 對我來說有點困難。 所以我在這里選擇將點擊消息發送到一個新的活動(詳細展示)。

希望我的代碼可以幫助某人。

我的適配器代碼

public class GPAAdapter extends RecyclerView.Adapter<GPAAdapter.ViewHolder> {
private ArrayList<GPAModel> mGPAList;
Context context;

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView lessonNameText;
    TextView lessonCodeText;
    TextView teacherNameText;
    TextView semesterNameText;
    View listView;
    ArrayList<GPAModel> list = new ArrayList<GPAModel>();
    Context ctx;

    public ViewHolder(View gpaItemView, Context myCtx, ArrayList<GPAModel> myList) {
        super(gpaItemView);
        gpaItemView.setOnClickListener(this);
        this.list = myList;
        this.ctx = myCtx;
        lessonNameText = (TextView) gpaItemView.findViewById(R.id.gpa_lessonName);
        lessonCodeText = (TextView) gpaItemView.findViewById(R.id.gpa_lessonCode);
        teacherNameText = (TextView) gpaItemView.findViewById(R.id.gpa_teacherName);
        semesterNameText = (TextView) gpaItemView.findViewById(R.id.gpa_semesterName);
        listView = gpaItemView;
    }

    @Override
    public void onClick(View view) {
        int position = getAdapterPosition();
        GPAModel sendGPA = this.list.get(position);
        Intent intent = new Intent(this.ctx, GPADetail.class);
        intent.putExtra("lessonName", sendGPA.getLessonName());
        intent.putExtra("lessonCode", sendGPA.getLessonCode());
        intent.putExtra("creditPoint", sendGPA.getCreditPoint());
        intent.putExtra("teacherName", sendGPA.getTeacherName());
        intent.putExtra("semesterName", sendGPA.getSemesterName());
        intent.putExtra("totalStudentNumber", sendGPA.getTotalStudentNumber());
        //
        ArrayList<String> scoreValue = new ArrayList<String>();
        scoreValue = sendGPA.getScoreValue();
        intent.putExtra("scoreValue", scoreValue);
        //
        ArrayList<Float> studentCount = new ArrayList<Float>();
        studentCount = sendGPA.getStudentCount();
        intent.putExtra("studentCount",studentCount);
        this.ctx.startActivity(intent);

    }
}
public GPAAdapter(ArrayList<GPAModel> myList, Context myContext) {

    this.mGPAList = myList;
    this.context = myContext;
}
@Override
public  ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.gpa_item, parent, false);
    final ViewHolder holder = new ViewHolder(view, context, mGPAList);
    return holder;
}
public void setData(List<GPAModel> viewData) {
    mGPAList.clear();
    mGPAList.addAll(viewData);
    notifyDataSetChanged();
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    GPAModel data = mGPAList.get(position);
    holder.setIsRecyclable(true);
    holder.lessonNameText.setText(data.getLessonName());
    holder.lessonCodeText.setText(data.getLessonCode());
    holder.teacherNameText.setText(data.getTeacherName());
    holder.semesterNameText.setText(data.getSemesterName());
}
@Override
public int getItemCount() {
    return mGPAList.size();
}

}

我的清單片段

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View gpaView = inflater.inflate(R.layout.fragment_gpa, container, false);
    RecyclerView gpaRecyclerView = (RecyclerView) gpaView.findViewById(R.id.gpa_list);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    gpaRecyclerView.setLayoutManager(layoutManager);
    GPAAdapter adapter = new GPAAdapter(getData());
    gpaRecyclerView.setAdapter(adapter);
    return gpaView;

}

private List<GPAModel> getData() {
}

然后像這樣將上下文上載到 AppCompatActivity 並獲取 getSupportFragmentManager

 FragmentTransaction transaction =((AppCompatActivity) context).getSupportFragmentManager().beginTransaction();
 transaction.replace(R.id.frame_container, new CartLayout()); // Add your fragment class
 transaction.addToBackStack(null);
 transaction.commit();

暫無
暫無

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

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