【问题标题】:Clicking CardView to load a fragment点击 CardView 加载片段
【发布时间】:2015-06-09 05:37:40
【问题描述】:

我在使用 RecyclerView 实现可点击卡片时遇到问题。我想获取点击哪张卡片的位置,然后加载正确的片段。

我确实查看了this post 并花了将近 30 分钟试图理解代码并自己实现它,但当我意识到 sn-p 中有多少错误时我放弃了。

这是我的适配器类。

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {

public static CardView cv;

public static class PersonViewHolder extends RecyclerView.ViewHolder {
    TextView chapterName;
    TextView chapterNumber;
    // ImageView chapterPhoto;

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

        cv = (CardView) itemView.findViewById(R.id.cv);
        chapterName = (TextView) itemView.findViewById(R.id.chapter_name);
        chapterNumber = (TextView) itemView.findViewById(R.id.chapter_number);
        // chapterPhoto = (ImageView) itemView.findViewById(R.id.person_photo);

    }
}

List<Chapter> chapters;

RVAdapter(List<Chapter> chapters) {
    this.chapters = chapters;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
    PersonViewHolder pvh = new PersonViewHolder(v);
    return pvh;
}

@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
    personViewHolder.chapterName.setText(chapters.get(i).chapterName);
    personViewHolder.chapterNumber.setText(chapters.get(i).chapterNumber);
    // personViewHolder.chapterPhoto.setImageResource(persons.get(i).photoId);
}

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

我已经查看了 StackOverflow 上的每个实现,要么我有狭隘的视野,要么它们都没有真正起作用。我知道旁边有很多帖子,但在问这个问题之前我确实花了很多时间寻找答案,所以所有这些链接对我来说都是紫色的。

感谢所有帮助,我非常乐意发布任何其他可能有帮助的代码!

【问题讨论】:

    标签: android android-fragments android-recyclerview android-cardview


    【解决方案1】:

    为此,您需要使用自己的 Clicklistener 将 OnClickListener 添加到 ViewHolder,如下所示:

    新界面:

    public interface PersonViewHolderClickListener {
    
        void onItemClick(long id);
    }
    

    并像这样更改您的 RVAdapter 类:

    protected Context mContext;
    
    RVAdapter(Context context, List<Chapter> chapters) {
        mContext = context;
        this.chapters = chapters;
    }
    
    public static class PersonViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView chapterName;
        TextView chapterNumber;
        // ImageView chapterPhoto;
    
        private long PERSONId;
    
        public PersonViewHolderClickListener clickListener;
    
        public PersonViewHolder(View itemView,PersonViewHolderClickListener clickListener) {
            super(itemView);
    
            cv = (CardView) itemView.findViewById(R.id.cv);
            chapterName = (TextView) itemView.findViewById(R.id.chapter_name);
            chapterNumber = (TextView) itemView.findViewById(R.id.chapter_number);
            // chapterPhoto = (ImageView) itemView.findViewById(R.id.person_photo);
    
            this.clickListener = clickListener;
    
            view.setOnClickListener(this);  
        }
    
        @Override
        public void onClick(View v) {
            clickListener.onItemClick(PERSONId);
        }
    }
    
    @Override
    public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
        PersonViewHolder pvh = new PersonViewHolder(v, new PersonViewHolderClickListener() {
    
            @Override
            public void onItemClick(long id) {
                Intent intent = new Intent(mContext, YOURActivity.class);
                intent.putExtra(EXTRA_PERSON_ID, id);
                mContext.startActivity(intent);
            }
        });
        return pvh;
    }
    
    @Override
    public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
        personViewHolder.chapterName.setText(chapters.get(i).chapterName);
        personViewHolder.chapterNumber.setText(chapters.get(i).chapterNumber);
        // personViewHolder.chapterPhoto.setImageResource(persons.get(i).photoId);
        personViewHolder.PERSONId = i;
        }
    

    【讨论】:

    • 您已经向我提供了代码,这似乎是我试图弄清楚的,但我需要解释如何根据卡的位置加载适当的活动。我认为这与 Intent 额外有关,但我不确定。
    • 我需要解释的原因是,如果没有额外的 Intent 代码似乎无法工作,并且有了它,我收到了这个错误:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference, at com.wsandhu.studyapwh.RVAdapter$1.onItemClick(RVAdapter.java:74), at com.wsandhu.studyapwh.RVAdapter$PersonViewHolder.onClick(RVAdapter.java:52)
    • 在 onBindViewHolder 中,您获得的位置为:i,此值在 viewholder 中存储为:PERSONId,在 onItemClick 中,您将 PERSONId 存储在 ViewHolder 中,为:id,这是原始位置您点击的卡片。我猜你使用一个只会显示一个特定项目的活动?这就是为什么我将此项目的 id / 位置作为额外内容放入此活动的意图的原因,因此在您的活动中,您可以阅读此额外内容,现在要显示哪个项目,
    • 好吧,您提供的代码不起作用...我提到的错误仍然很普遍。
    • 错误看起来像您没有将您启动适配器的活动作为适配器的上下文传递给您,您会看到:RVAdapter(Context context, List&lt;Chapter&gt; chapters) 当您调用它时,您必须传递一个有效的上下文,根据异常,看起来你在那里传递了一个 null
    【解决方案2】:

    我的完整工作代码,感谢@fmt.Println.MKO。

    RVAdapter.java:

    import android.content.Context;
    import android.content.Intent;
    import android.support.v7.widget.CardView;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> implements View.OnClickListener {
    
        Context mContext;
    
        RVAdapter(Context context, List<Chapter> chapters) {
            mContext = context;
            this.chapters = chapters;
        }
    
        public static CardView cv;
        public static int position;
    
        public class PersonViewHolder extends RecyclerView.ViewHolder {
            TextView chapterName;
            TextView chapterNumber;
            // ImageView chapterPhoto;
    
            public PersonViewHolder(View itemView) {
                super(itemView);
    
                cv = (CardView) itemView.findViewById(R.id.cv);
                chapterName = (TextView) itemView.findViewById(R.id.chapter_name);
                chapterNumber = (TextView) itemView.findViewById(R.id.chapter_number);
                // chapterPhoto = (ImageView) itemView.findViewById(R.id.person_photo);
    
                itemView.setOnClickListener(RVAdapter.this);
                position = getPosition();
            }
        }
    
        @Override
        public void onClick(View v) {
    
                Intent intent = new Intent(mContext, ChapterActivity.class);
                mContext.startActivity(intent);
        }
    
        List<Chapter> chapters;
    
        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
        }
    
        @Override
        public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
            PersonViewHolder pvh = new PersonViewHolder(v);
            return pvh;
        }
    
        @Override
        public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
            personViewHolder.chapterName.setText(chapters.get(i).chapterName);
            personViewHolder.chapterNumber.setText(chapters.get(i).chapterNumber);
            // personViewHolder.chapterPhoto.setImageResource(persons.get(i).photoId);
    
        }
    
        @Override
        public int getItemCount() {
            return chapters.size();
        }
    
    }
    

    带有 RecyclerView 的片段:

    import android.os.Bundle;
    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.ArrayList;
    import java.util.List;
    
    public class UnitOneFragment extends android.support.v4.app.Fragment {
    
        private List<Chapter> chapters;
        private RecyclerView rv;
        private RecyclerView.LayoutManager llm;
    
        public UnitOneFragment() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View v = inflater.inflate(R.layout.fragment_unit_one, container, false);
    
            rv = (RecyclerView) v.findViewById(R.id.rv);
            rv.setHasFixedSize(true);
    
            llm = new LinearLayoutManager(getActivity());
            rv.setLayoutManager(llm);
    
            initializeData();
            initializeAdapter();
    
            return v;
        }
    
        private void initializeData() {
            chapters = new ArrayList<>();
            chapters.add(new Chapter("Human Prehistory to the Early Civilizations", "Chapter One"));
            chapters.add(new Chapter("Classical China", "Chapter Two"));
            chapters.add(new Chapter("Classical India", "Chapter Three"));
            chapters.add(new Chapter("Classical Greece and Rome", "Chapter Four"));
            chapters.add(new Chapter("Classical Period: Declines and Diversities", "Chapter Five"));
        }
    
        private void initializeAdapter() {
            RVAdapter adapter = new RVAdapter(getActivity(), chapters);
            rv.setAdapter(adapter);
        }
    
    }
    
    class Chapter {
        String chapterName;
        String chapterNumber;
        // int photoId;
    
        Chapter(String chaptername, String chapternumber) {
            this.chapterName = chaptername;
            this.chapterNumber = chapternumber;
            // this.photoId = photoId;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多