如何从“回收者视图"中获取物品? [英] How to get item from Recycler View?

查看:79
本文介绍了如何从“回收者视图"中获取物品?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用回收者视图"创建了列表.现在,我想在单击后获取项目.我听说过getAdapterPosition,但我不知道如何使用它.我尝试了类似的方法,但老实说不知道如何获得它.

I created list using Recycler View. Now I want to get item after click. I heard about getAdapterPosition but I dont know how to use it. I try something like this but honestly dont know how to get it.

我的片段类代码:

public class FragmentOne extends Fragment {

    private static RecyclerView.Adapter adapter;
    private RecyclerView.LayoutManager layoutManager;
    private static RecyclerView recyclerView;
    private List<MovieDb> data;
    private MovieDb movieDb;
    static View.OnClickListener myOnClickListener;

    public static FragmentOne newInstance() {
        FragmentOne fragment = new FragmentOne();
        return fragment;
    }

    public class MovieTask extends AsyncTask<Void, Void, List<MovieDb>> {
        @Override
        protected List<MovieDb> doInBackground(Void... voids) {
            MovieResultsPage movies = new TmdbApi("f753872c7aa5c000e0f46a4ea6fc49b2").getMovies().getUpcoming("en-US", 1, "US");
            List<MovieDb> listMovies = movies.getResults();

            return listMovies;
        }

        @Override
        protected void onPostExecute(List<MovieDb> movieDb) {
            data = movieDb;
            adapter = new CustomAdapter(data);
            recyclerView.setAdapter(adapter);
        }
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View returnView = inflater.inflate(R.layout.fragment_one, container, false);

        myOnClickListener = new MyOnClickListener(getContext());

        recyclerView = (RecyclerView) returnView.findViewById(R.id.my_recycler_view);
        recyclerView.setHasFixedSize(true);

        layoutManager = new LinearLayoutManager(getContext());  // ???
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        MovieTask mt = new MovieTask();
        mt.execute();

        return returnView;
    }

    private class MyOnClickListener implements View.OnClickListener {

        private final Context context;

        private MyOnClickListener(Context context) {
            this.context = context;
        }

        @Override
        public void onClick(View v) {
            int pos1;
            pos1 = adapter.getItemId();
            movieDb = data.get(pos);
            TextView text;
            text = (TextView) v.findViewById(R.id.text1);
            Toast.makeText(getActivity(), text.getText(), LENGTH_SHORT).show();
        }

    }
}

功能OnClick很乱,因为我尝试了很多.我可以从TextView中获取文本,但这不是我想要的.

Function OnClick is mess because I try a lot. I can get text from TextView but it is not what I want.

有我的适配器类:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {

    private List<MovieDb> dataSet;
    public int pos;

    public static class MyViewHolder extends RecyclerView.ViewHolder {

        TextView textViewName;
        TextView textViewVersion;
        ImageView imageViewIcon;
        int pos;

        public MyViewHolder(View itemView) {
            super(itemView);
            this.textViewName = (TextView) itemView.findViewById(R.id.text1);
            this.textViewVersion = (TextView) itemView.findViewById(R.id.text2);
            this.imageViewIcon = (ImageView) itemView.findViewById(R.id.imageView);
            itemView.setOnClickListener(FragmentOne.myOnClickListener);
        }
    }

    public CustomAdapter(List<MovieDb> data) {
        this.dataSet = data;
    }



    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                           int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.cards_layout, parent, false);

        //view.setOnClickListener(FragmentOne.myOnClickListener);

        MyViewHolder myViewHolder = new MyViewHolder(view);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {

        TextView textViewName = holder.textViewName;
        TextView textViewVersion = holder.textViewVersion;
        pos = holder.getAdapterPosition();
        ImageView imageView = holder.imageViewIcon;
        Glide.with(imageView).load("https://image.tmdb.org/t/p/w500" + dataSet.get(listPosition).getPosterPath()).into(imageView);

        textViewName.setText(dataSet.get(listPosition).getOriginalTitle());
        textViewVersion.setText(dataSet.get(listPosition).getReleaseDate());
    }

    public int getPos(){
        return pos;
    }

    @Override
    public int getItemCount() {
        if(dataSet == null){
            return 0;
        }
        return dataSet.size();
    }
}

我尝试使用 int pos 来获取位置,但是我不知道如何在OnClick函数中使用它.

I try to get position using int pos but I dont know how to use it in function OnClick.

推荐答案

创建一个界面,以在单击时检索MovieDb:

Create an interface to retrieve a MovieDb when clicked:

public interface OnMovieDbClicked {
    void movieDbClicked(MovieDb movieDb);
}

在您的适配器中,创建此接口的私有成员和setter:

In your adapter create a private member of this interface and a setter:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
    private OnMovieDbClicked onMovieDbClicked;

    public setOnMovieDbClicked(OnMovieDbClicked onMovieDbClicked) {
        this.onMovieDbClicked = onMovieDbClicked;
    }
}
    

然后,您可以在ViewHolder的构造函数中使用 getAdapterPosition(),并使用 onMovieDbClicked 将被单击的项目发送到片段:

You can then use getAdapterPosition() in the constructor of your ViewHolder and use onMovieDbClicked to send the item clicked to your fragment:

public class MyViewHolder extends RecyclerView.ViewHolder {
    public MyViewHolder(View itemView) {
        // Initialize your views

        itemView.setOnClickListener(view -> {
            int pos = getAdapterPosition();
            
            if (onMovieDbClicked != null && pos != RecyclerView.NO_POSITION) {
                MovieDb movieDb = dataSet.get(pos);
                onMovieDbClicked.movieDbClicked(movieDb);
            }
        });
    }
}

在片段中创建适配器时,也请调用 setOnMovieDbClicked():

When you're creating your adapter in your fragment, call setOnMovieDbClicked() as well:

adapter = new CustomAdapter(data);
adapter.setOnMovieDbClicked(movieDb -> {
    // Do whatever you want with movieDb
});

这篇关于如何从“回收者视图"中获取物品?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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