繁体   English   中英

在回收站视图适配器中显示自定义弹出窗口 class - Android Java

[英]Show customize pop up in recycler view adapter class - Android Java

我有一个片段 class ,其中包含编辑文本、按钮和recycler view 我的回收站视图使用card view的 xml 布局。 我的卡片视图包含文本视图和一个按钮(?),在被点击后显示一个弹出窗口。
在此处输入图像描述
我尝试像往常一样在我的片段 class 中添加弹出代码,但它指出我的片段无法访问回收者的视图卡视图布局。 所以我尝试将它添加到我的适配器 class 中,但我遇到了getActivty()无法识别的问题。
这是我on click时在我的view holder方法中添加的内容

                    btnHelp.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Popup_FreedomWall popup_freedomWall = new Popup_FreedomWall();
                            Bundle args = new Bundle();
                            System.out.println("=================TVFWID==========================");
                            System.out.println(tvFwId.getText().toString());
                            System.out.println("=====================TVFWID======================");
                            //data to get for report - uid(reported,get reported),freedom wall id
                            args.putString("user", mod_freedomWall.uid_report);
                            args.putString("reportedPost", tvFwId.getText().toString());
                            popup_freedomWall.setArguments(args);

                            popup_freedomWall.show();
                            popup_freedomWall.show(getActivity().getSupportFragmentManager(), "My Fragment");
                        }
                    });
    ```
<br/>


`Mod_FreedomWall.java` 我的片段
public class Mod_FreedomWall_UserAdapter extends RecyclerView.Adapter<Mod_FreedomWall_UserAdapter.ViewHolder> {
    Mod_FreedomWall mod_freedomWall = new Mod_FreedomWall();
    private ArrayList<Mod_FreedomWall_User> user;
    String freeId,reporterId;

    public  Mod_FreedomWall_UserAdapter(Mod_FreedomWall context, ArrayList<Mod_FreedomWall_User> list){
        user = list;
    }
    
public  class ViewHolder extends RecyclerView.ViewHolder{
        ImageView ivUserProfile;
        TextView tv_message,tv_username,tv_date,tvTime,tvFwId;
        Button btnHelp;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            btnHelp = (Button) itemView.findViewById(R.id.btnHelp);
            ivUserProfile = (ImageView) itemView.findViewById(R.id.ivUserProfile);
            tv_message = (TextView) itemView.findViewById(R.id.tv_message);
            tv_username = (TextView) itemView.findViewById(R.id.tv_username);
            tv_date = (TextView) itemView.findViewById(R.id.tv_date);
            tvTime = (TextView) itemView.findViewById(R.id.tvTime);
            tvFwId = (TextView) itemView.findViewById(R.id.tvFwId);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    btnHelp.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            System.out.println("=================TVFWID==========================");
                            System.out.println(tvFwId.getText().toString());
                            System.out.println("=====================TVFWID======================");
                            freeId = tvFwId.getText().toString();
                            reporterId = mod_freedomWall.uid_report;
                        }
                    });
                }
            });
        }
    }


    @NonNull
    @Override
    public Mod_FreedomWall_UserAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.mod_freedomwall_post,viewGroup,false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull Mod_FreedomWall_UserAdapter.ViewHolder viewHolder, int position) {
        viewHolder.itemView.setTag(user.get(position));

        viewHolder.tvFwId.setVisibility(View.INVISIBLE);
        viewHolder.tv_message.setText(user.get(position).getMessage());
        viewHolder.tv_username.setText(user.get(position).getUsername());
        viewHolder.tv_date.setText(user.get(position).getDate());
        viewHolder.tvTime.setText(user.get(position).getTime());
        viewHolder.tvFwId.setText(user.get(position).getFreedomWallId());
        viewHolder.ivUserProfile.setImageResource(R.drawable.ic_username_white);

    }
    @Override
    public int getItemCount() {
        return user.size();
    }
    public interface MyListener {
        void onItemClicked(String uid,String fwid); 
    }

    MyListener mListener;


    public void setListener(MyListener listener) {
        mListener = listener;
    }
}



我的适配器

public class Mod_FreedomWall_UserAdapter extends RecyclerView.Adapter<Mod_FreedomWall_UserAdapter.ViewHolder> { Mod_FreedomWall mod_freedomWall = new Mod_FreedomWall(); private ArrayList<Mod_FreedomWall_User> user; String freeId,reporterId; public Mod_FreedomWall_UserAdapter(Mod_FreedomWall context, ArrayList<Mod_FreedomWall_User> list){ user = list; } public class ViewHolder extends RecyclerView.ViewHolder{ ImageView ivUserProfile; TextView tv_message,tv_username,tv_date,tvTime,tvFwId; Button btnHelp; public ViewHolder(@NonNull View itemView) { super(itemView); btnHelp = (Button) itemView.findViewById(R.id.btnHelp); ivUserProfile = (ImageView) itemView.findViewById(R.id.ivUserProfile); tv_message = (TextView) itemView.findViewById(R.id.tv_message); tv_username = (TextView) itemView.findViewById(R.id.tv_username); tv_date = (TextView) itemView.findViewById(R.id.tv_date); tvTime = (TextView) itemView.findViewById(R.id.tvTime); tvFwId = (TextView) itemView.findViewById(R.id.tvFwId); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { btnHelp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { System.out.println("=================TVFWID=========================="); System.out.println(tvFwId.getText().toString()); System.out.println("=====================TVFWID======================"); freeId = tvFwId.getText().toString(); reporterId = mod_freedomWall.uid_report; } }); } }); } } @NonNull @Override public Mod_FreedomWall_UserAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.mod_freedomwall_post,viewGroup,false); return new ViewHolder(v); } @Override public void onBindViewHolder(@NonNull Mod_FreedomWall_UserAdapter.ViewHolder viewHolder, int position) { viewHolder.itemView.setTag(user.get(position)); viewHolder.tvFwId.setVisibility(View.INVISIBLE); viewHolder.tv_message.setText(user.get(position).getMessage()); viewHolder.tv_username.setText(user.get(position).getUsername()); viewHolder.tv_date.setText(user.get(position).getDate()); viewHolder.tvTime.setText(user.get(position).getTime()); viewHolder.tvFwId.setText(user.get(position).getFreedomWallId()); viewHolder.ivUserProfile.setImageResource(R.drawable.ic_username_white); } @Override public int getItemCount() { return user.size(); } public interface MyListener { void onItemClicked(String uid,String fwid); } MyListener mListener; public void setListener(MyListener listener) { mListener = listener; } }

先感谢您!

据我了解,您有两种可能的方法来解决这个问题。

  1. 在适配器的构造函数中发送一个上下文,并用您传递的上下文替换您需要“getActivity()”的部分(通过适配器中的变量)。
  2. 使用接口方法。 我从不喜欢上下文风格,所以我会给你一个接口方法的例子。

在您的适配器中:

public abstract class YourAdapter extends ...<> {

    public interface MyListener {
        void onItemClicked(String someData); //can change this variable to whatever is needed, if any.
    }

    MyListener mListener;
    ...

然后让按钮的onClickListener调用你刚刚创建的接口function,而不是直接尝试弹出一个弹窗:

    btnHelp.setOnClickListener(v -> onItemClicked("this is my data i pass through");

然后将 function 添加到您的适配器以设置侦听器(或将其作为参数添加到构造函数中,无论您想要什么):

public void setListener(MyListener listener) {
        mListener = listener;
    }

并在您的片段中实现侦听器:

adapter.setListener(new YourAdapter.MyListener() {
        @Override
        public void onItemClicked(String myData) {
            //create your popup and simply call getActivity() since this is inside the Fragment
        }
    });

--- 你的片段 ---

public class Mod_FreedomWall extends Fragment {

    RecyclerView recyclerView;
    RecyclerView.Adapter myAdapter; //<-- 1 *remove*
    RecyclerView.LayoutManager layoutManager; // obsolete, can be deleted. You make a local variable later on.
    Mod_FreedomWall_UserAdapter adapter; // <-- 2 *rename to myAdapter*
  @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.mod_freedomwall, container, false);
        recyclerView = (RecyclerView) v.findViewById(R.id.freedomWallPost);

        return v;

    }

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        recyclerView = (RecyclerView) view.findViewById(R.id.freedomWallPost);
        recyclerView.setHasFixedSize(true);

        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, true);
        layoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(layoutManager);

// You call a function of `adapter` here, but adapter hasn't been 
// properly initialised yet, it's null so far, so that won't go well. 
// *rename adapter to myAdapter and move this part down*
adapter.setListener(new Mod_FreedomWall_UserAdapter.MyListener() {
            @Override
            public void onItemClicked(String uid, String fwid) {
                Popup_FreedomWall popup_freedomWall = new Popup_FreedomWall();
                Bundle args = new Bundle();
                //data to get for report - uid(reported,get reported),freedom wall id
                args.putString("user",uid);
                args.putString("reportedPost", fwid);
                popup_freedomWall.setArguments(args);
                popup_freedomWall.show(getActivity().getSupportFragmentManager(), "My Fragment");
            }
        });

        btnPost.setOnClickListener(new View.OnClickListener() {
            final Date c = Calendar.getInstance().getTime();
            final SimpleDateFormat df = new SimpleDateFormat("MM-dd-yy", Locale.getDefault());
            final String formattedDate = df.format(c);
            final Date currentTime = Calendar.getInstance().getTime();
            final DateFormat dateFormat = new SimpleDateFormat("hh.mm aa");
            final String dateString = dateFormat.format(new Date());

            @Override
            public void onClick(View v) {
                String message = etPost.getText().toString();
                createPost(message, user_name, dateString, formattedDate, level);
                myAdapter.notifyDataSetChanged();
                etPost.setText("");
            }
        });

        user = new ArrayList<Mod_FreedomWall_User>();
        retrievePost();

        //Here you initialise your adapter
        myAdapter = new Mod_FreedomWall_UserAdapter(this, user);
        //you can move your `myAdapter.setListener` to this spot.
        recyclerView.setAdapter(myAdapter);
    }

好吧,您声明了两个适配器,但实际上只使用了一个。 好像有点混

去做; 报废其中一个适配器(编号 1)。 然后最简单的方法是将编号 2 的adapter重命名为myAdapter并将 adapter.setListener 的adapter更改为adapter.setListener myAdapter.setListener(...

然后将myAdapater.setListener(...移动到myAdapter = new Mod_FreedomWall_UserAdapter(this, user);下方的位置,因为那是您实际初始化适配器的位置。在此之前,您无法安全地调用适配器的函数。

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM