android - 在回收站视图中删除子布局行
问题描述
在我的 android 应用程序中,我有一个回收站视图和搜索栏。我正在从 db 获取数据。当我从数据库中搜索相应的数据时,根据从数据库中获取的 json 数组的长度,在回收器视图中添加行数。现在问题来了,当我执行另一个搜索时,上次搜索生成的行没有被删除。添加感染新行。例如,当我第一次进行搜索时,添加了 3 行,因为 json 数组的长度为 3。下次我进行搜索时,假设 json 数组的长度为 2,那么前 3 行没有被删除感染我得到 5 行(上一个搜索 3 行,下一个搜索 2 行)。我希望如果我进行搜索,则应删除从先前搜索生成的行。
adapterise = new MessagesAdapter(MessageItem,home_Activity);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapterise);
try {
JSONArray jsonArray = new JSONArray(output);
recyclerView.removeAllViewsInLayout();
recyclerView.setAdapter(null);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapterise);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);//returnJson;
pic=jsonObject.getString("pic");
MessageItem.add(new MessageItem(pic,jsonObject.getString("name"),jsonObject.getString("email"),jsonObject.getString("mobile"),jsonObject.getString("uid")));
}
}
这是我的适配器代码
class MessagesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView imageView;
ImageView imageViewc;
ImageView imageViewm;
TextView textView1;
TextView textView2;
TextView textView3;
CardView card;
String pos;
boolean selected= false;
MessagesViewHolder(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
imageViewc = itemView.findViewById(R.id.call);
imageViewm = itemView.findViewById(R.id.msg);
textView1 = itemView.findViewById(R.id.placename);
textView2 = itemView.findViewById(R.id.placedescription);
textView3 = itemView.findViewById(R.id.placedescriptions);
card = itemView.findViewById(R.id.card);
imageViewc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent callIntent = new Intent(Intent.ACTION_DIAL);
callIntent.setData(Uri.parse("tel:"+textView3.getText().toString()));
context.startActivity(callIntent);
}
});
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent callIntent = new Intent(context, LoadPic.class);
callIntent.putExtra("url",pos);
context.startActivity(callIntent);
}
});
imageViewm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Fragment fragment = new WriteMessageToUser();
if(fragment!=null) {
for (Fragment fragments : ((HomeActivity)context).getSupportFragmentManager().getFragments()) {
((HomeActivity)context).getSupportFragmentManager().beginTransaction().remove(fragments).commit();
}
}
FragmentTransaction transaction=((HomeActivity)context).getSupportFragmentManager().beginTransaction();
Bundle bundle=new Bundle();
bundle.putString("email", textView2.getText().toString());
bundle.putString("heading",textView1.getText().toString());
fragment.setArguments(bundle);
transaction.replace(R.id.nav_host_fragment,fragment);
transaction.commit();
}
});
card.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
card.setCardBackgroundColor(ContextCompat.getColor(context,R.color.light_blue));
selected=true;
delete_chat.setVisibility(View.VISIBLE);
receivers.add(card.getTag().toString());
return true;
}
});
card.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(selected){
receivers.remove(card.getTag().toString());
card.setCardBackgroundColor(ContextCompat.getColor(context,R.color.white));
selected=false;
}
if(receivers.size()==0){
delete_chat.setVisibility(View.GONE);
}
}
});
}
@Override
public void onClick(View view) {
}
}
public MessagesAdapter(List<MessageItem> exampleList, Context context) {
this.exampleList = exampleList;
this.context = context;
exampleListFull = new ArrayList<>(exampleList);
}
@NonNull
@Override
public MessagesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_item,
parent, false);
return new MessagesViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull MessagesViewHolder holder, final int position) {
MessageItem currentItem = exampleList.get(position);
if(currentItem.getImageResource().contains("https:")){
Glide.with(context).load(currentItem.getImageResource()).into(holder.imageView);
Glide.with(context).load(currentItem.getImageResource()).apply(RequestOptions.circleCropTransform()).into(holder.imageView);
holder.pos=currentItem.getImageResource();
}else{
Glide.with(context).load(ROOT_URL+"/"+currentItem.getImageResource()).into(holder.imageView);
Glide.with(context).load(ROOT_URL+"/"+currentItem.getImageResource()).apply(RequestOptions.circleCropTransform()).into(holder.imageView);
holder.pos=ROOT_URL+"/"+currentItem.getImageResource();
}
holder.textView1.setText(currentItem.getText1());
holder.textView2.setText(currentItem.getText2());
holder.textView3.setText(currentItem.getText3());
holder.card.setTag(currentItem.gettextTag());
}
@Override
public int getItemCount() {
return exampleList.size();
}
解决方案
您需要从构造函数中删除向适配器添加数据。所以代替这个
public MessagesAdapter(List<MessageItem> exampleList, Context context) {
this.exampleList = exampleList;
this.context = context;
exampleListFull = new ArrayList<>(exampleList);
}
您需要编写自定义方法:
public void addDataToAdapter(List<MessageItem> exampleList) {
exampleList.clear()
this.exampleList.addAll(exampleList)
notifyDataSetChanged()
}
然后,从您的班级中调用此方法,例如adapter.addDataToAdapter(yourList)
您的适配器的构造函数将类似于
public MessagesAdapter(Context context) {
this.context = context;
exampleListFull = new ArrayList<>();
}
推荐阅读
- angular - 如何让 {{ab}} 以角度工作
- java - 设置文本编辑文本
- jquery - jQuery Validate 不适用于隐藏的输入
- node.js - Changing the default file to be loaded using lite-server
- nao-robot - Nao Robot unresponsive on boot
- python-3.x - How to put formula for columns in python pandas?
- excel - How to return object to UiPath in VBA?
- amazon-web-services - 尝试返回 mp3 文件时出现 Alexa 技能错误
- r - 如何存储和显示闪亮改变的顺序数据?
- java - 如何防止 Dockerfile 中的脚本退出?