简体   繁体   English

在 RecyclerView 中单击项目的问题

[英]Problem with Clicking Items in RecyclerView

This is one of my tab fragment.这是我的标签片段之一。

I just wanted to show the list of Movies & Tv Shows that includes the word in SearchView And when I click one of the images, it moves to the Detail Activity.我只是想在 SearchView 中显示包含该词的电影和电视节目列表当我单击其中一张图像时,它会移动到详细信息活动。

The problem happens when I search two or more words continuously.当我连续搜索两个或更多单词时会出现问题。

It moves to proper Detail Activity and when I close that Activity it comes with several other unrelated Detail Activity.它移动到正确的详细信息活动,当我关闭该活动时,它与其他几个不相关的详细信息活动一起出现。

I need you guys help我需要你们帮助

First code is the Fragment Code第一个代码是片段代码

package com.example.endterm.Fragment;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.SearchView;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.endterm.ItemAdapter;
import com.example.endterm.Items;
import com.example.endterm.MovieDetail;
import com.example.endterm.R;
import com.example.endterm.TVDetail;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;

public class SearchFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    SearchView searchView;
    TextView tVQuery;

    String queryWord;

    //RecyclerView recyclerView7, recyclerView8;
    ItemAdapter adapter7 = new ItemAdapter(7);
    ItemAdapter adapter8 = new ItemAdapter(8);

    public SearchFragment() {
        // Required empty public constructor
    }

    class MyItmeDecoration extends RecyclerView.ItemDecoration{

        @Override
        public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
            super.getItemOffsets(outRect, view, parent, state);
            outRect.set(10, 10, 10, 10);
            view.setBackgroundColor(Color.BLACK);
        }
    }

    // TODO: Rename and change types and number of parameters
    public static SearchFragment newInstance(String param1, String param2) {
        SearchFragment fragment = new SearchFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_search, container, false);

        tVQuery = (TextView) rootView.findViewById(R.id.query);


        searchView = (SearchView) rootView.findViewById(R.id.search);
        //final MyItmeDecoration Deco = new MyItmeDecoration();

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String s) {

                queryWord = s;
                tVQuery.setText("Searched by : " + s);
                // 입력받은 문자열 처리
                searchView.onActionViewCollapsed();

                adapter7.empty();
                adapter8.empty();
                adapter7.notifyDataSetChanged();
                adapter8.notifyDataSetChanged();


                exp(adapter7, "https://api.themoviedb.org/3/search/movie?api_key=0a9a6b6bcc6ed2a798fb5401045dd81f&language=ko&query=" + s + "&page=1&include_adult=false", true);
                exp(adapter8, "https://api.themoviedb.org/3/search/tv?api_key=0a9a6b6bcc6ed2a798fb5401045dd81f&language=ko&page=1&query=" + s + "&include_adult=false", false);


                return true;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                // 입력란의 문자열이 바뀔 때 처리
                return false;
            }
        });


        return rootView;
    }

    private void exp(final ItemAdapter adapterS, String urlE, final boolean movieortv){
        final RecyclerView rec;
        if(movieortv) {
            rec = (RecyclerView) getActivity().findViewById(R.id.searchedMovie);
        }
        else{
            rec = (RecyclerView) getActivity().findViewById(R.id.searchedTV);
        }
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getActivity());
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        rec.setLayoutManager(linearLayoutManager);

        MyItmeDecoration Deco = new MyItmeDecoration();
        if(Deco != null){
            rec.removeItemDecoration(Deco);
        }
        rec.addItemDecoration(Deco);


        rec.setAdapter(adapterS);
        RequestQueue queue= Volley.newRequestQueue(getActivity());

        StringRequest fR=new StringRequest(Request.Method.GET, urlE, new Response.Listener<String>(){
            @Override
            public void onResponse(String response) {
                parseXMLForecast(rec, response, adapterS, movieortv);
            }
        }, new Response.ErrorListener(){
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });

        queue.add(fR);

    }

    private void parseXMLForecast(RecyclerView rec, String response, ItemAdapter adaptersample, final boolean movieortv){
        try{
            final ArrayList<Items> items = new ArrayList<>();
            JSONObject jsonObject = new JSONObject(response);
            String results = jsonObject.getString("results");
            JSONArray jsonArray = new JSONArray(results);

            for(int i = 0; i < jsonArray.length(); i++){
                JSONObject subJsonObject = jsonArray.getJSONObject(i);

                String url = "https://image.tmdb.org/t/p/w300" + subJsonObject.getString("poster_path");
                String title;
                if(movieortv) {
                    title = subJsonObject.getString("title");
                }
                else{
                    title = subJsonObject.getString("name");
                }
                String id = subJsonObject.getString("id");

                Items jump = new Items(url, title, id);
                items.add(jump);
            }
            adaptersample.setItems(items);
            adaptersample.notifyDataSetChanged();

            rec.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), rec, new ClickListener() {
                @Override
                public void onClick(View view, int position) {
                    Items dict = items.get(position);
                    Intent intent;
                    if(movieortv == true) {
                        intent = new Intent(getActivity(), MovieDetail.class);
                    }
                    else{
                        intent = new Intent(getActivity(), TVDetail.class);
                    }
                    intent.putExtra("id", dict.getId());
                    intent.putExtra("url", dict.getUrl());
                    intent.putExtra("title", dict.getTitle());

                    startActivity(intent);
                }

                @Override
                public void onLongClick(View view, int position) {
                    Items dict = items.get(position);
                    Toast.makeText(getActivity(), dict.getTitle()+' '+dict.getId()+' '+dict.getUrl(), Toast.LENGTH_LONG).show();
                }
            }));


        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    public interface ClickListener {
        void onClick(View view, int position);

        void onLongClick(View view, int position);
    }

    public static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

        private GestureDetector gestureDetector;
        private SearchFragment.ClickListener clickListener;

        public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final SearchFragment.ClickListener clickListener) {
            this.clickListener = clickListener;
            gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }

                @Override
                public void onLongPress(MotionEvent e) {
                    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                    if (child != null && clickListener != null) {
                        clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child));
                    }
                }
            });
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            View child = rv.findChildViewUnder(e.getX(), e.getY());
            if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
                clickListener.onClick(child, rv.getChildAdapterPosition(child));
            }
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {
        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        }
    }

}

And the Second one is the Adapter Code if you need如果需要,第二个是适配器代码

package com.example.endterm;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.example.endterm.Items;

import java.util.ArrayList;


public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder>{

    private ArrayList<Items> items = new ArrayList<>();

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

    private int wheree;

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }

    public ItemAdapter(int wheree){
        this.wheree = wheree;
    }

    public ItemAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
        View itemView = null;
        if(wheree == 1) {
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.imageswork1, parent, false);
        }
        else if(wheree == 2){
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.imageswork2, parent, false);
        }
        else if(wheree == 3){
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.imageswork3, parent, false);
        }
        else if(wheree == 4){
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.imageswork4, parent, false);
        }
        else if(wheree == 5){
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.imageswork5, parent, false);
        }
        else if(wheree == 6){
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.imageswork6, parent, false);
        }
        else if(wheree == 7){
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.imageswork7, parent, false);
        }
        else if(wheree == 8){
            itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.imageswork8, parent, false);
        }
        ViewHolder viewHolder = new ViewHolder(itemView);
        return viewHolder;
    }

    public void onBindViewHolder(@NonNull ItemAdapter.ViewHolder viewHolder, int position) {
        Items item  = items.get(position);

        Glide.with(viewHolder.itemView.getContext())
                .load(item.getUrl())
                .into(viewHolder.weatherImageView);

    }

    class ViewHolder extends RecyclerView.ViewHolder{
        public ImageView weatherImageView;

        public ViewHolder(View itemView){
            super(itemView);
            if(wheree == 1){
                weatherImageView=(ImageView)itemView.findViewById(R.id.item_image1);
            }
            else if(wheree == 2){
                weatherImageView = (ImageView)itemView.findViewById(R.id.item_image2);
            }
            else if(wheree == 3){
                weatherImageView = (ImageView)itemView.findViewById(R.id.item_image3);
            }
            else if(wheree == 4){
                weatherImageView = (ImageView)itemView.findViewById(R.id.item_image4);
            }
            else if(wheree == 5){
                weatherImageView = (ImageView)itemView.findViewById(R.id.item_image5);
            }
            else if(wheree == 6){
                weatherImageView = (ImageView)itemView.findViewById(R.id.item_image6);
            }
            else if(wheree == 7){
                weatherImageView = (ImageView)itemView.findViewById(R.id.item_image7);
            }
            else if(wheree == 8){
                weatherImageView = (ImageView)itemView.findViewById(R.id.item_image8);
            }
        }
    }
    public void empty(){
        for(int i = 0; i < getItemCount(); i++){
            items.remove(0);

        }
    }

    public int getItemCount() {
        return items.size();
    }

    public void setItems(ArrayList<Items> items){
        this.items = items;
    }



}

First of all, remove this code, you do not need this here首先,去掉这段代码,这里不需要

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

Then, you did not implement getItemId() correctly.然后,您没有正确实现getItemId() You can change this like that:你可以这样改变:

@Override
public long getItemId(int position) {
    return items.get(position).getId(); //if you have item id, of course
}

I think the problem is because you are not specifying the items id, that is why it is opening several activities.我认为问题在于您没有指定项目 ID,这就是它打开多个活动的原因。 Try this out.试试这个。 Hope it helps希望能帮助到你

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在 RecyclerView 中单击最喜欢的项目时出现问题 - Problem with clicking on favorite item in RecyclerView 使 RecyclerView 中的项目可点击时出现问题 - Problem in making the items in RecyclerView clickable 单击recyclerview项目后无法更改片段 - Not able to change fragment after clicking on recyclerview items RecyclerView问题加载了n个以上的项目 - RecyclerView problem to load more than n items 单击侦听器以查看RecyclerView中的项目,仅在单击两次时有效 - Click Listener for items in RecyclerView working only on clicking twice 单击“查看全部”按钮后如何显示 RecyclerView 项目 - How to display RecyclerView items after clicking on "View All" button 如何通过单击 recyclerview 中的项目在具有 web 视图的新片段上加载网站? - How to load a website on a new fragment with a web view by clicking on items in the recyclerview? 单击RecyclerView项目后禁用按钮时出现问题 - Problem while disabling button after click in RecyclerView items 单击 EditText 字段后,RecyclerView 项目失去 MATCH_PARENT 设置 - RecyclerView Items loosing MATCH_PARENT setting after clicking on EditText Field 单击适配器内的按钮后,从自己的活动中更改 recyclerview 适配器项目 - Change recyclerview adapter items from own activity after clicking on button inside adapter
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM