[英]onClickListener on a CardView in a RecyclerView created by a Fragment in a Fragment in an Activity
這是一個多部分的問題。
第一部分:
我正在構建一個用於跟蹤本地事件的應用。 目前,我有一個片段,其中包含一個由CardView組成的RecyclerView,每個CardView代表一個事件。 我想要的是能夠點按一張卡並將片段替換為新卡,以顯示有關該卡事件的更多詳細信息。
我已經在Google上搜索了幾個小時,但是當我嘗試使用它們時,提出的解決方案似乎都沒有用。 下面是片段Tab1的類,該片段創建RecyclerView適配器。
public class Tab1 extends Fragment {
//RecyclerView
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
//ProgressDialog
private ProgressDialog pDialog;
// URL to get contacts JSON
private static String url = "removed";
// JSON Node names
private static final String TAG_EVENT = "event";
private static final String TAG_EVENTNAME = "Event Name";
private static final String TAG_LOCATION = "Location";
private static final String TAG_RAINLOCATION = "Rain Location";
private static final String TAG_ORG = "Org";
private static final String TAG_TIME = "Time";
private static final String TAG_RSVP = "RSVP";
// events JSONArray
JSONArray events = null;
private List<Event> eventlist;
private RecyclerView rv;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v =inflater.inflate(R.layout.tab_2,container,false);
// Calling async task to get json
new GetEvents().execute();
return v;
}
public void onViewCreated(View view, Bundle savedInstanceState) {
mRecyclerView = (RecyclerView) getView().findViewById(R.id.my_recycler_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
}
private class GetEvents extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
// Creating service handler class instance
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
eventlist = new ArrayList<>();
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
events = jsonObj.getJSONArray(TAG_EVENT);
// looping through All Events
for (int i = 0; i < events.length(); i++) {
JSONObject c = events.getJSONObject(i);
String eventName = c.getString(TAG_EVENTNAME);
String location = c.getString(TAG_LOCATION);
String rain = c.getString(TAG_RAINLOCATION);
String org = c.getString(TAG_ORG);
String time = c.getString(TAG_TIME);
SimpleDateFormat format = new SimpleDateFormat("EEE, MMM d, h:mm a", Locale.US);
SimpleDateFormat parserSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
try {
Date date = parserSDF.parse(time);
time = format.format(date);
} catch (ParseException e) {
e.printStackTrace();
}
String rsvp = c.getString(TAG_RSVP);
eventlist.add(new Event(eventName, time.toUpperCase(), location, R.drawable.pace));
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Dismiss the progress dialog
if (pDialog.isShowing())
pDialog.dismiss();
RVAdapter adapter = new RVAdapter(eventlist);
mRecyclerView.setAdapter(adapter);
}
}
}
這是RVAdapter
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.EventViewHolder> {
public static class EventViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
CardView cv;
TextView eventName;
TextView eventTime;
TextView eventLocation;
ImageView orgPhoto;
private ClickListener clickListener;
EventViewHolder(View itemView) {
super(itemView);
cv = (CardView)itemView.findViewById(R.id.cv);
eventName = (TextView)itemView.findViewById(R.id.event_name);
eventTime = (TextView)itemView.findViewById(R.id.event_time);
eventLocation = (TextView)itemView.findViewById(R.id.event_location);
orgPhoto = (ImageView)itemView.findViewById(R.id.org_photo);
itemView.setOnClickListener(this);
}
public interface ClickListener {
/**
* Called when the view is clicked.
*
* @param v view that is clicked
* @param position of the clicked item
*/
public void onClick(View v, int position, String title);
}
/* Setter for listener. */
public void setClickListener(ClickListener clickListener) {
this.clickListener = clickListener;
}
@Override
public void onClick(View v) {
clickListener.onClick(v, getPosition(), eventName.getText().toString());
}
}
List<Event> events;
RVAdapter(List<Event> events){
this.events = events;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public EventViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.event_card, viewGroup, false);
EventViewHolder pvh = new EventViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(EventViewHolder EventViewHolder, final int i) {
EventViewHolder.eventName.setText(events.get(i).name);
EventViewHolder.eventTime.setText(events.get(i).time);
EventViewHolder.eventLocation.setText(events.get(i).location);
EventViewHolder.orgPhoto.setImageResource(events.get(i).orgPhoto);
EventViewHolder.setClickListener(new EventViewHolder.ClickListener() {
@Override
public void onClick(View v, int pos, String title) {
//onClick
}
});
}
@Override
public int getItemCount() {
return events.size();
}
}
您可以看到我已經嘗試實現該接口和onClickListener。 這是正確的方法嗎? 我已經嘗試通過單擊“卡片”的名稱來進行烤面包來進行測試,但是它似乎沒有起作用,或者至少沒有顯示烤面包。
第二部分:
如果這是正確的方法並且應該起作用,那么在哪里/如何編寫代碼以用新的片段替換片段,以顯示有關事件的更多信息? 可以進入Adapter類嗎? Tab1片段實際上位於活動內的另一個片段內。 我想替換Tab1的父片段。
看看是否有幫助
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.EventViewHolder> {
public static class EventViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
CardView cv;
TextView eventName;
TextView eventTime;
TextView eventLocation;
ImageView orgPhoto;
EventViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cv);
eventName = (TextView) itemView.findViewById(R.id.event_name);
eventTime = (TextView) itemView.findViewById(R.id.event_time);
eventLocation = (TextView) itemView.findViewById(R.id.event_location);
orgPhoto = (ImageView) itemView.findViewById(R.id.org_photo);
}
@Override
public void onClick(View view) {
//do stuff
}
}
List<Event> events;
RVAdapter(List<Event> events){
this.events = events;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public EventViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.event_card, viewGroup, false);
return new EventViewHolder(v);
}
@Override
public void onBindViewHolder(EventViewHolder EventViewHolder, final int i) {
EventViewHolder.eventName.setText(events.get(i).name);
EventViewHolder.eventTime.setText(events.get(i).time);
EventViewHolder.eventLocation.setText(events.get(i).location);
EventViewHolder.orgPhoto.setImageResource(events.get(i).orgPhoto);
}
@Override
public int getItemCount() {
return events.size();
}
}
對於問題的第二部分。 對於同時托管Frag1和Frag2的ParentActivity來說,切換片段更好。 可以這么說,在ParentActivity中,有一個托管Frag1的框架布局(R.id.container)。
您可以將事件調用傳遞回活動,並且可以執行此操作以替換容器中的片段
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, Frag2)
.commit();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.