点击RecyclerView中的CardView时加载一个片段

3

我有一个包含RecyclerViewCardView的组件。现在我想在点击CardView时加载一个简单的Fragment,但是我无法通过FragmentManager或SupportFragmentManager实现。请给我一些指导。

我的RecyclerViewAdapter和ViewHolder如下:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private String[] eventName;
    private String[] eventBrief;

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView textViewName, textViewBrief;
        public CardView cardView;

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

            textViewName = (TextView)v.findViewById(R.id.textViewName);
            textViewBrief = (TextView)v.findViewById(R.id.textViewBrief);
            final Context context = v.getContext();
            cardView = (CardView)v.findViewById(R.id.card_view);

            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    EventFragment eventFragment = EventFragment.newInstance();
                    // Load and view eventFragment here??
                }
            });
        }
    }

    public RecyclerViewAdapter(String[] eventName, String[] eventBrief) {
        this.eventName = eventName;
        this.eventBrief = eventBrief;

    }

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

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.textViewName.setText(eventName[position]);
        holder.textViewBrief.setText(eventBrief[position]);
    }

    @Override
    public int getItemCount() {
        return eventName.length;
    }
}
3个回答

7
在Adapter的构造函数中,为ViewHolder的itemView添加一个onClickListener()方法是一个简单的实现方式。
    public MyViewHolder(View view) {
        super(view);

        itemView.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){

                AppCompatActivity activity = (AppCompatActivity) view.getContext();
                Fragment myFragment = new MyFragment();
                activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();


            }
        });
    }

@martiendt @viper Fragment myFragment = new MyFragment(); 是什么意思? - sabbibJAVA
MyFragment 是你想要加载的片段的片段类 @sabbibJAVA - viper
@sabbibJAVA,你可以在这里看到我的实现 https://github.com/martiendt/daily-dhamma。我在 https://github.com/martiendt/daily-dhamma/blob/master/app/src/main/java/red/point/dailydhamma/ListFragment.java 中使用了它。 - martiendt

5

我无法使用FragmentManager或SupportFragmentManager完成此操作

这是因为RecyclerViewAdapter没有持有对FragmentManager的引用。您应该通知托管RecyclerView的Activity / Fragment发生了事件,并从那里启动片段。要执行此操作,请查看我的答案here


4

有很多种方法可以实现这个,但我认为最好的实现方式是回调到Activity通知已经点击了某个项目。以下是一些代码示例:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private String[] eventName;
private String[] eventBrief;
private OnItemClickListener listener;

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

    public TextView textViewName, textViewBrief;
    public CardView cardView;
    private OnItemClickListener listener;

    public ViewHolder(View v, OnItemClickListener listener) {
        super(v);

        textViewName = (TextView)v.findViewById(R.id.textViewName);
        textViewBrief = (TextView)v.findViewById(R.id.textViewBrief);
        final Context context = v.getContext();
        cardView = (CardView)v.findViewById(R.id.card_view);

        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(listener!=null)
                   listener.onItemClick(textViewName.getText().toString(),
         textViewBrief.getText().toString();
            }
        });
    }
}

public RecyclerViewAdapter(String[] eventName, String[] eventBrief) {
    this.eventName = eventName;
    this.eventBrief = eventBrief;
}

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

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.textViewName.setText(eventName[position]);
    holder.textViewBrief.setText(eventBrief[position]);
    holder.setOnItemClickListener(listener);
}

@Override
public int getItemCount() {
    return eventName.length;
}

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

public interface OnItemClickListener {
       public void onItemClick(String textName, String textViewBrief); 
    } 
}   

然后在您的活动中,只需要像这样实例化它:
RecyclerViewAdapter adapter = new RecyclerViewAdapter(eventName, eventBrief);
adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener(){
        public void onItemClick(String textName, String textViewBrief){
            EventFragment eventFragment = EventFragment.newInstance();
            //replace content frame with your own view.
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();    ft.replace(R.id.content_frame, eventFragment).commit()
       }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接