[英]How to parse an xml to java class with recycler view or in adapter of recyclerview
[英]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/>
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; } }
據我了解,您有兩種可能的方法來解決這個問題。
在您的適配器中:
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.