簡體   English   中英

RecyclerView中CardView上的onClickListener,由Activity中的片段中的片段創建

[英]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.

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