在RecycleView中的按钮上设置单击侦听器

时间:2016-03-25 01:42:39

标签: android android-recyclerview

我点击了它,它就会启动并显示正确的getText()方法,但是setText方法无效......

userAdapter.setOnEntryClickListener(new UserAdapter.OnEntryClickListener() {
            @Override
            public void onEntryClick(View view, int position) {
                DatabaseUser user = dbUsersList.get(position);
                    TextView clickedView = (TextView) view.findViewById(R.id.userAdapterFollowBtn);
                if(view == clickedView) {
                    if (clickedView.getText().equals("following")) {

                        Log.d(Constants.DEBUG, " THE CLICK VIEW IS " + clickedView.getText());
                        //APPLY Following
                        String txtFollow = "follow";
                        clickedView.setText(txtFollow);
                        if (user.getIsChanged() == 0) {
                            user.setIsChanged(1);
                        } else {
                            user.setIsChanged(0);
                        }
                        user.setIsType(3);
                        db.updateFollow(user);

                        userAdapter.notifyDataSetChanged();
                    } else {

                        clickedView.setText("following");
                        if (user.getIsChanged() == 0) {
                            user.setIsChanged(1);
                        } else {
                            user.setIsChanged(0);
                        }
                        user.setIsType(0);
                        db.updateFollow(user);

                        userAdapter.notifyDataSetChanged();
                    }
                } else {
                    Toast.makeText(getApplicationContext(), user.getUsername() + " is selected!", Toast.LENGTH_SHORT).show();
                    takeToUserProfile(dbUsersList.get(position));
                }
            }
        });

这是适配器类:

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

    private List<DatabaseUser> dbUsersList, followingList;
    private DatabaseHelper db;
    private Context context;
    private Typeface typeFace, italicTypeface, boldTypeface;


    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        public TextView userAdapterUsername, userAdapterFollowBtn;
        public ImageView userAdapterUserPicture;


        public MyViewHolder(View view) {
            super(view);
            userAdapterUsername = (TextView) view.findViewById(R.id.userAdapterUsername);
            userAdapterFollowBtn = (TextView) view.findViewById(R.id.userAdapterFollowBtn);
            userAdapterUserPicture = (ImageView) view.findViewById(R.id.userAdapterUserPicture);
            Log.d(Constants.DEBUG, "IN MY VIEW HOLDER");

            view.setOnClickListener(this);
            userAdapterFollowBtn.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            if (mOnEntryClickListener != null) {
                Log.d(Constants.DEBUG, "IN On click");
                mOnEntryClickListener.onEntryClick(v, getAdapterPosition());


            }
        }
    }
    private static OnEntryClickListener mOnEntryClickListener;

    public interface OnEntryClickListener {
        void onEntryClick(View view, int position);
    }

    public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener) {
        mOnEntryClickListener = onEntryClickListener;
    }


    public UserAdapter(Context mContext, List<DatabaseUser> usersList, List<DatabaseUser> passedFollowing, Typeface myTypeface, Typeface myTypefaceItalic, Typeface myTypefaceBold) {
        context = mContext;
        dbUsersList = usersList;
        followingList = passedFollowing;
        typeFace = myTypeface;
        italicTypeface = myTypefaceItalic;
        boldTypeface = myTypefaceBold;
        Log.d(Constants.DEBUG, "IN MY User ADAPTER CONSTRUCTOR");
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.follow_item, parent, false);
        Log.d(Constants.DEBUG, "RETURN ITEM VIEW HOLDER");


        return new MyViewHolder(itemView);
    }

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


         DatabaseUser user = dbUsersList.get(position);


        holder.userAdapterUsername.setTypeface(boldTypeface);

        holder.userAdapterUsername.setText(user.getUsername());

        final int pos = getItemViewType(position);
        //TODO Create pic link

        if(containsId(dbUsersList.get(pos), followingList)) {
            //Then show following
            holder.userAdapterFollowBtn.setText("following");


        } else {
            //show follow
            holder.userAdapterFollowBtn.setText("follow");
        }



        String userspic = dbUsersList.get(pos).getPicture();
        if(userspic == null) {
            //SET DEFAULT OR PUT DEFAULT IN XML AND DO NOTHING IT SHOULD SHOW DEFAULT PIC
        } else {
            //TODO setupUser Pic
            String img1 = "http://www.hindustantimes.com/Images/popup/2015/6/kungfu2.jpg";
            Picasso.with(context).load(img1).transform(new RoundedTransformation()).into(holder.userAdapterUserPicture);

        }

    }

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

    public static boolean containsId(DatabaseUser currentUser, List<DatabaseUser> list) {
        for (DatabaseUser object : list) {
            if (currentUser.getUserId().equals(object.getUserId())) {
                return true;
            }
        }
        return false;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }
}

1 个答案:

答案 0 :(得分:0)

我在这个项目中做了同样的事情,去这里复制这个itemclicklistener类: https://github.com/isaacurbina/MyMovies/blob/c985f28311f25522c7907d090e48dab5fc108c01/app/src/main/java/com/mobileappsco/training/mymovies/Listeners/RecyclerItemClickListener.java

然后在您的Activity或Fragment上使用您的recyclerview对象执行此操作。

recyclerView.addOnItemTouchListener(
                new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        // HERE GOES YOUR CODE FOR THE CLICK OF THE ITEM
                    }
                })
        );

然后你可以使用该位置来引用你的适配器正在使用的对象列表中的原始对象(列表应该是公共的,以便你可以从Activity或Fragment访问它),或者像我一样做并放一个带有ID的隐藏文本视图,而不是您可以获得的位置:

TextView clickedItem =(TextView)view.findViewById(R.id.hidden_​​id_textview); int id = clickedItem.getText();

您还可以在上面的链接中查看包含我发送给您的课程的整个项目。我希望它有所帮助。

亲切的问候!