0

У меня возникли проблемы с внедрением кликов с моим RecyclerView. Я хочу получить позицию, на которую была нажата карта, а затем загрузить соответствующий фрагмент.Щелчок CardView для загрузки фрагмента

Я посмотрел this post и потратил почти 30 минут, пытаясь понять код и реализовать его сам, но я сдался, когда понял, сколько ошибок было в фрагменте.

Вот мой класс адаптера.

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 и либо у меня туннельное зрение или ни один из них на самом деле работает. Я знаю, что на стороне есть много сообщений, но я потратил больше времени на поиск ответа, прежде чем задавать этот вопрос, поэтому все эти ссылки фиолетовые для меня.

Вся помощь приветствуется, и я был бы более чем счастлив опубликовать любой другой код, который может помочь!

ответ

2

TODO этого вам нужно добавить OnClickListener к вашему ViewHolder с собственным Clicklistener, как это:

новый интерфейс:

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; 
    } 
+0

Вы ввели мне код, и кажется, что это то, что я пытаюсь выяснить, но мне нужно объяснение того, как загрузить соответствующее действие в зависимости от положения карты. Я думаю, что это имеет какое-то отношение к Intent, но я не уверен. – wasimsandhu

+0

Причина, по которой мне нужно объяснение, заключается в том, что код не работает без дополнения Intent и с ним, я получаю эту ошибку: 'java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String android.content.Context.getPackageName() 'в ссылке нулевого объекта, в com.wsandhu.studyapwh.RVAdapter $ 1.onItemClick (RVAdapter.java:74), at com.wsandhu.studyapwh.RVAdapter $ PersonViewHolder.onClick (RVAdapter .java: 52) ' – wasimsandhu

+0

в onBindViewHolder вы получаете позиции как: i, это значение хранится внутри пользователя в виде: ЧЕЛОВЕК, в onItemClick вы получаете PERSONId, хранящийся внутри ViewHolder как: id, и это было исходное положение которую вы нажали. я предполагаю, что вы используете одно действие, которое будет отображать только один конкретный элемент? вот почему я поместил id/position этого элемента в качестве дополнительного в намерение этой операции, поэтому в вашей деятельности вы можете прочитать это дополнительно, и теперь какой элемент показывать, –

1

Мой полный рабочий код, с благодарностью @ 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; 
    } 
} 
Смежные вопросы