我们如何处理RecyclerView中来自多个项目视图的点击? [英] How Do We Handle Click From Multiple Item View in RecyclerView?

查看:68
本文介绍了我们如何处理RecyclerView中来自多个项目视图的点击?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有问题: RecyclerView中显示的数据分为三部分.如您所知,所有数据都显示在收藏夹"页面中,这意味着它们不是恒定的.如果用户按下收藏夹"按钮,数据将显示在收藏夹"页面中,否则不会显示.因此,所有数据每次都会更改,这取决于用户活动.因此,当用户单击某些项目时,我在获取项目的ID时会遇到麻烦.

I have problem: There is three part of data that displayed in one RecyclerView. As you know, all of data are displayed in favourite page, which mean, they are not constant. If user press the favourite button, the data will be displayed in favourite page, otherwise it's won't. So, all of data are change every time, it depends on user activity. Because of this, I get trouble in getting item's ID when user click certain item.

我已经尝试解决此问题,但仍然停留了很多天...

I've already tried to solve this problem, but still stuck many days...

ShowFavouriteList.java

public class ShowFavouriteList extends AppCompatActivity implements AdapterFavList.FavListener {

    private RecyclerView recyclerView;
    private TextView noFavtsTV;
    AppPreferences appPreferences;
    private SearchView searchView;
    private AdapterFavList yAdapterFavlist;
    private AdapterFavList mAdapterFavlist;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_favourite_list);

        SwipeRefreshLayout pullToRefresh = findViewById(R.id.pullToRefresh);
        pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                finish();
                startActivity(getIntent());
            }
        });

        //toolbar logo and desc
        Toolbar topToolBar = (Toolbar) findViewById(R.id.toolbarTidur);
        setSupportActionBar(topToolBar); //munculkan menu ke toolbar
        getSupportActionBar().setDisplayHomeAsUpEnabled(true); //this line shows back button

        recyclerView = findViewById(R.id.recycler_view);
        noFavtsTV = findViewById(R.id.no_favt_text);

        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0);
        SharedPreferences sPTuru = getApplicationContext().getSharedPreferences("MyTuru", 0);
        SharedPreferences sPHome = getApplicationContext().getSharedPreferences("MyHome", 0);
        PreferenceMenejer preferenceMenejer = new PreferenceMenejer(sharedPreferences, sPTuru, sPHome);
        appPreferences = new AppPreferences(preferenceMenejer);

        fetchData();

    } // Oncreate

    private void fetchData() {
        List<Story> storyList = appPreferences.getFavouriteCardList();
        List<YukulModel> yukulList = appPreferences.getFavouriteYukul();
        List<HomeModel> modelList = appPreferences.getFavouriteHome();

        if(storyList != null && storyList.size() > 0) {
            showNoFavtText(false);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
            recyclerView.setAdapter(new AdapterFavList(this, storyList, yukulList, modelList, this, appPreferences));
        }

        if(yukulList != null && yukulList.size() > 0) {
            showNoFavtText(false);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
            yAdapterFavlist = new AdapterFavList(this, storyList, yukulList, modelList, this, appPreferences);
            recyclerView.setAdapter(yAdapterFavlist);
        }

        if(modelList != null && modelList.size() > 0) {
            showNoFavtText(false);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
            mAdapterFavlist = new AdapterFavList(this, storyList, yukulList, modelList, this, appPreferences);
            recyclerView.setAdapter(mAdapterFavlist);
        }

    }

    @Override
    public void onItemKlik(int pos) {
        // Tidur List
        List<HomeModel> modelList = appPreferences.getFavouriteHome();
        HomeModel click = modelList.get(pos);
        Toast.makeText(getApplicationContext(), "Selected: " + click.getName(), Toast.LENGTH_LONG).show();
        int id = Integer.parseInt(click.getIdStory());
        if(modelList != null && modelList.size() > 0) {
            if (id == 0) {
                startActivity(new Intent(this, DoaPagi.class));
            } else if (id == 1) {
                startActivity(new Intent(this, DoaSore.class));
            } else if (id == 2) {
                startActivity(new Intent(this, DoaWc.class));
            } else if (id == 3) {
                startActivity(new Intent(this, DoaMasjid.class));
            } else if (id == 4) {
                startActivity(new Intent(this, DzikirShalat.class));
            } else if (id == 5) {
                startActivity(new Intent(this, ChildYukul.class));
            } else if (id == 6) {
                startActivity(new Intent(this, DoaPakaian.class));
            } else if (id == 7) {
                startActivity(new Intent(this, ChildTidur.class));
            }
        }
    }

    private void showNoFavtText(boolean show) {
        noFavtsTV.setVisibility(show ? View.VISIBLE : View.GONE); //jika data yang ditampilkan tidak ada, maka show noFavsTv
        recyclerView.setVisibility(show ? View.GONE : View.VISIBLE); //jika data yang ditampilkan tidak ada, maka don't show rV
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search_fav, menu);
        getMenuInflater().inflate(R.menu.menu_main, menu);

        // Associate searchable_tidur configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.action_search_fav).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);

        // listening to search query text change
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                // filter recycler view when query submitted
                mAdapterFavlist.getFilter().filter(query);
                 return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                // filter recycler view when text is changed
                mAdapterFavlist.getFilter().filter(query);
                return false;
            }
        });
        return true;
    }

    // Agar back button pada halaman induk settings berfungsi
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.search_fav) {
            return true;
        }

        switch (item.getItemId()) {
            case android.R.id.home:
                this.finish();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

AdapterFavList.java

public class AdapterFavList extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {

    public static final String ACTION_LIKE_IMAGE_CLICKED = "action_like_image_button";

    final int VIEW_TYPE_TIDUR = 0;
    final int VIEW_TYPE_YUKUL = 1;
    final int VIEW_TYPE_HOME = 2;

    private Context context;
    private AppPreferences appPreferences;
    private List<Story> storyList;
    private List<YukulModel> yukulList;
    private List<HomeModel> homeList;
    private List<HomeModel> homeListFiltered;
    private List<Object> collection = new ArrayList<Object>();
    private FavListener listener;

    private int changedItemPosition;
    private int posisiItemYukul;
    private int posisiItemHome;
    private boolean isLiked;

    public AdapterFavList(Context context, List<Story> storyList, List<YukulModel> yukulList, List<HomeModel> homeList, FavListener listener, AppPreferences appPreferences) {

        this.context = context;
        this.storyList = storyList;
        this.yukulList = yukulList;
        this.homeListFiltered = homeList;
        this.listener = listener;
        this.appPreferences = appPreferences;

        addData();
    }

    public interface FavListener {
        void onItemKlik(int pos);
        // void onTidurKlik(int pos);
        // void onYukulKlik(int pos);
    }

    public void addData() {
        storyList = appPreferences.getFavouriteCardList();
        yukulList = appPreferences.getFavouriteYukul();
        homeList = appPreferences.getFavouriteHome();

        if(storyList != null && storyList.size() > 0) {
            collection.addAll(storyList);
        }

        if(yukulList != null && yukulList.size() > 0) {
            collection.addAll(yukulList);
        }

        if(homeList != null && homeList.size() > 0) {
            collection.addAll(homeListFiltered);
        }
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if(viewType == VIEW_TYPE_TIDUR) {
            return new tidurViewHolder(LayoutInflater.from(context).inflate(R.layout.item_story_favourite_list, parent, false));
        }

        if(viewType == VIEW_TYPE_YUKUL) {
            return new yukulViewHolder(LayoutInflater.from(context).inflate(R.layout.item_favourite_yukul, parent, false));
        }

        if(viewType == VIEW_TYPE_HOME) {
            return new homeViewHolder(LayoutInflater.from(context).inflate(R.layout.item_fav_home, parent, false));
        }

        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        Object item = collection.get(position);

        if(holder instanceof tidurViewHolder){
            ((tidurViewHolder) holder).setViewData((Story) item, holder.getAdapterPosition());
        }

        if(holder instanceof yukulViewHolder){
            ((yukulViewHolder) holder).viewDataYukul((YukulModel) item, holder.getAdapterPosition());
        }

        if(holder instanceof homeViewHolder){
            ((homeViewHolder) holder).viewDataHome((HomeModel) item, holder.getAdapterPosition());
        }
    }

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

    @Override
    public int getItemViewType(int position){

        Object item = collection.get(position);

        if(item instanceof Story) {
            return VIEW_TYPE_TIDUR;
        }

        if(item instanceof YukulModel){
            return VIEW_TYPE_YUKUL;
        }

        if(item instanceof HomeModel){
            return VIEW_TYPE_HOME;
        }

        return -1;
    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                List<HomeModel> homeList = appPreferences.getFavouriteHome();
                if (charString.isEmpty()) {
                    homeListFiltered = homeList;
                }
                else {
                    List<HomeModel> filteredList = new ArrayList<>();
                    for (HomeModel row : homeList) {

                        if ( row.getName().toLowerCase().contains(charString.toLowerCase()) ) {
                            filteredList.add(row);
                        }
                    }

                    homeListFiltered = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = homeListFiltered;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                homeListFiltered = (ArrayList<HomeModel>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    } //Filter

    public void tidurPutHeart(boolean isChecked, Story tidurstory) {
        SharedPreferences tidursharedPreferences = context.getSharedPreferences("Turu", Activity.MODE_PRIVATE);
        SharedPreferences.Editor tidureditor = tidursharedPreferences.edit();
        tidureditor.putBoolean(tidurstory.getIdStory(), isChecked);
        tidureditor.commit();
    }

    public void yukulPutHeart(boolean isChecked, YukulModel yukulstory) {
        SharedPreferences yukulsharedPreferences = context.getSharedPreferences("Yukul", Activity.MODE_PRIVATE);
        SharedPreferences.Editor yukuleditor = yukulsharedPreferences.edit();
        yukuleditor.putBoolean(yukulstory.getIdStory(), isChecked);
        yukuleditor.commit();
    }

    public void homePutHeart(boolean isChecked, HomeModel homestory) {
        SharedPreferences homesharedPreferences = context.getSharedPreferences("Home", Activity.MODE_PRIVATE);
        SharedPreferences.Editor homeeditor = homesharedPreferences.edit();
        homeeditor.putBoolean(homestory.getIdStory(), isChecked);
        homeeditor.commit();
    }

    //ViewHolder
    public class tidurViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;
        private CheckBox likeCheckBox;

        public tidurViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text_view);
            likeCheckBox = itemView.findViewById(R.id.like_button_cb);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // send selected contact in callback

                }
            });
        } // itemView


        public void setViewData(final Story story, final int adapterPosition) {

            textView.setText(story.getName());

            if (story.getIsLiked() == 1) {
                likeCheckBox.setChecked(false);
            }
            else {
                likeCheckBox.setChecked(true);
            }

            likeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    changedItemPosition = adapterPosition;

                    if (buttonView.isPressed()) {
                        if (isChecked) {
                            tidurPutHeart(isChecked, story);
                            appPreferences.saveFavouriteCard(story);
                        }
                        else {
                            isLiked = false;
                            tidurPutHeart(isChecked, story);
                            appPreferences.deleteCard(story.getIdStory());
                            // updateLikes();
                            Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show();

                            if(collection.size() == 0) {
                                ((Activity)context).finish();
                                context.startActivity(((Activity) context).getIntent());
                            }
                        }
                    }
                }
            });

        } //setviewdata

        public void updateLikes() {
            if (!isLiked && storyList.get(changedItemPosition).getIsLiked() == 0) { //jika like dicabut (pada posisi hati yang sedang merah) di halaman favourite list
                storyList.get(changedItemPosition).setIsLiked(0); //maka cabut juga warna merah di halaman favourite list
                notifyItemRangeChanged(getAdapterPosition(), collection.size());
                collection.remove(getAdapterPosition());
                notifyItemRemoved(getAdapterPosition());
            }

        } //updateLikes

    } //tidurViewholder


    //homeViewHolder
    public class homeViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;
        private CheckBox likeCheckBox;

        public homeViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text_view);
            likeCheckBox = itemView.findViewById(R.id.like_button_cb);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // send selected contact in callback
                    if (listener != null){
                        int position = getAdapterPosition();

                        if (position != RecyclerView.NO_POSITION) {
                            listener.onItemKlik(position);
                        }
                    }

                }
            });
        } // itemView


        public void viewDataHome(final HomeModel story, final int adapterPosition) {

            textView.setText(story.getName());

            if (story.getIsLiked() == 1) {
                likeCheckBox.setChecked(false);
            }
            else {
                likeCheckBox.setChecked(true);
            }

            likeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    changedItemPosition = adapterPosition;

                    if (buttonView.isPressed()) {
                        if (isChecked) {
                            homePutHeart(isChecked, story);
                            appPreferences.saveFavouriteHome(story);
                        }
                        else {
                            isLiked = false;
                            homePutHeart(isChecked, story);
                            appPreferences.deleteCardHome(story.getIdStory());
                            // updateLikesHome();
                            Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show();

                            if(collection.size() == 0) {
                                ((Activity)context).finish();
                                context.startActivity(((Activity) context).getIntent());
                            }
                        }
                    }
                }
            });

        } //setviewdata

        public void updateLikesHome() {
            if (!isLiked && homeList.get(changedItemPosition).getIsLiked() == 0) { //jika like dicabut (pada posisi hati yang sedang merah) di halaman favourite list
                homeList.get(changedItemPosition).setIsLiked(0); //maka cabut juga warna merah di halaman favourite list
                notifyItemRangeChanged(getAdapterPosition(), collection.size());
                collection.remove(getAdapterPosition());
                notifyItemRemoved(getAdapterPosition());
            }

        } //updateLikes

    } //homeviewholder


    public class yukulViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;
        private CheckBox likeCheckBox;

        public yukulViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text_view);
            likeCheckBox = itemView.findViewById(R.id.like_button_cb);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // send selected contact in callback

                }
            });
        } //itemview

        public void viewDataYukul(final YukulModel yukulId, final int adapterPosition) {

            textView.setText(yukulId.getName());

            if (yukulId.getIsLiked() == 1) {
                likeCheckBox.setChecked(false);
            }
            else {
                likeCheckBox.setChecked(true);
            }

            likeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    posisiItemYukul = adapterPosition;

                    if (buttonView.isPressed()) {
                        if (isChecked) {
                            yukulPutHeart(isChecked, yukulId);
                            appPreferences.saveFavouriteYukul(yukulId);
                        }
                        else {
                            isLiked = false;
                            yukulPutHeart(isChecked, yukulId);
                            appPreferences.deleteCardYukul(yukulId.getIdStory());
                            // updateLikeYukul();
                            Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show();

                            if(collection.size() == 0) {
                                ((Activity)context).finish();
                                context.startActivity(((Activity) context).getIntent());
                            }
                        }
                    }
                }
            });

        } //viewdatayukul

        public void updateLikeYukul() {
            if (!isLiked && yukulList.get(changedItemPosition).getIsLiked() == 0) { //jika like dicabut (pada posisi hati yang sedang merah) di halaman favourite list
                yukulList.get(changedItemPosition).setIsLiked(0); //maka cabut juga warna merah di halaman favourite list
                notifyItemRangeChanged(getAdapterPosition(), collection.size());
                collection.remove(getAdapterPosition());
                notifyItemRemoved(getAdapterPosition());
            }
        } //updateLikes

    } //yukulviewholder


} //HomeAdapter

推荐答案

尝试使用适配器

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

ClickItem clickItem;
Context context;

//your data model
ArrayList<ModelField> modelFields;

public RecyclerviewAdapter(Context context, ArrayList<ModelField> modelField, ClickItem clickItem) {
    this.context = context;
    this.modelFields = modelField;
    this.clickItem = clickItem;
}

@Override
public int getItemViewType(int position) {

    //get view type
    return super.getItemViewType(position);
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    // get view create
    return null;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    // set bind view

    if (holder instanceof viewHolder_1) {
        ((viewHolder_1) holder).bind(modelFields.get(position));
    } else if (holder instanceof viewHolder_2) {
        ((viewHolder_2) holder).bind(modelFields.get(position));
    } else if (holder instanceof viewHolder_3) {
        ((viewHolder_3) holder).bind(modelFields.get(position));
    }

}

@Override
public int getItemCount() {

    //arraylist size
    return modelFields.size();
}

interface ClickItem {
    void onClick(RecyclerView.ViewHolder viewHolder, ModelField modelField, int position);
}

public class viewHolder_1 extends RecyclerView.ViewHolder {


    public viewHolder_1(@NonNull View itemView) {
        super(itemView);

        //casting views
    }

    public void bind(final ModelField item) {

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clickItem.onClick(viewHolder_1.this, item, getAdapterPosition());
            }
        });

    }


}

public class viewHolder_2 extends RecyclerView.ViewHolder {

    public viewHolder_2(@NonNull View itemView) {
        super(itemView);

        //casting views
    }

    public void bind(final ModelField item) {

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clickItem.onClick(viewHolder_2.this, item, getAdapterPosition());
            }
        });

    }
}

public class viewHolder_3 extends RecyclerView.ViewHolder {

    public viewHolder_3(@NonNull View itemView) {
        super(itemView);

        //casting views
    }

    public void bind(final ModelField item) {

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clickItem.onClick(viewHolder_3.this, item, getAdapterPosition());
            }
        });

    }
}

}

并使用

RecyclerviewAdapter recyclerviewAdapter = new RecyclerviewAdapter(this, your data arraylist, new RecyclerviewAdapter.ClickItem() {
            @Override
            public void onClick(RecyclerView.ViewHolder viewHolder, ModelField   modelField, int position) {

            }
        });
recyclerview.setAdapter(recyclerviewAdapter);

这篇关于我们如何处理RecyclerView中来自多个项目视图的点击?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆