简体   繁体   English

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

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

I have a fragment class that contains edit text,button and the recycler view .我有一个片段 class ,其中包含编辑文本、按钮和recycler view my recycler view use an xml layout of card view .我的回收站视图使用card view的 xml 布局。 my card view contains text view and a button(?) to show a pop up after being clicked.我的卡片视图包含文本视图和一个按钮(?),在被点击后显示一个弹出窗口。
在此处输入图像描述
I tried to add the pop up code in my fragment class as I usually do, but it's pointing out that my fragment doesn't have access to recycler's view card view layout.我尝试像往常一样在我的片段 class 中添加弹出代码,但它指出我的片段无法访问回收者的视图卡视图布局。 So I tried to add it in my adapter class but I'm getting stuck with getActivty() not getting recognize.所以我尝试将它添加到我的适配器 class 中,但我遇到了getActivty()无法识别的问题。
this is what I added in my view holder method inside on click这是我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` my Fragment `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;
    }
}



My Adapter我的适配器

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; } }

Thank you in advance! 先感谢您!

From what I understand you have two possible approaches to this problem.据我了解,您有两种可能的方法来解决这个问题。

  1. Send a Context with in your Adapter's constructor and replace the part where you need the "getActivity()" with that context you passed through (obv via a variable in your Adapter).在适配器的构造函数中发送一个上下文,并用您传递的上下文替换您需要“getActivity()”的部分(通过适配器中的变量)。
  2. Use an Interface approach.使用接口方法。 I never like the Context style, so I'll give you an example for an Interface approach.我从不喜欢上下文风格,所以我会给你一个接口方法的例子。

In your Adapter:在您的适配器中:

public abstract class YourAdapter extends ...<> {

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

    MyListener mListener;
    ...

Then let the onClickListener of the button call the Interface function you just created instead of trying to make a popup directly:然后让按钮的onClickListener调用你刚刚创建的接口function,而不是直接尝试弹出一个弹窗:

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

Then add a function to your Adapter to set the listener (or add it as argument in the constructor, whatever you want):然后将 function 添加到您的适配器以设置侦听器(或将其作为参数添加到构造函数中,无论您想要什么):

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

And implement the listener in your Fragment:并在您的片段中实现侦听器:

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

--- Your 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);
    }

Well, you declared two adapters but only really used one.好吧,您声明了两个适配器,但实际上只使用了一个。 Seems a bit mixed up.好像有点混

To-do;去做; Scrap one of the adapters (number 1).报废其中一个适配器(编号 1)。 Then the simplest way is to rename adapter at number 2 to myAdapter and also change the adapter at adapter.setListener to myAdapter.setListener(... .然后最简单的方法是将编号 2 的adapter重命名为myAdapter并将 adapter.setListener 的adapter更改为adapter.setListener myAdapter.setListener(...

Then move that myAdapater.setListener(... to a place below myAdapter = new Mod_FreedomWall_UserAdapter(this, user); since that is where you actually initialise your adapter. Before that point you can't safely call the your adapter's functions.然后将myAdapater.setListener(...移动到myAdapter = new Mod_FreedomWall_UserAdapter(this, user);下方的位置,因为那是您实际初始化适配器的位置。在此之前,您无法安全地调用适配器的函数。

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

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