在我的Android应用中,我有一个回收站视图,并且有搜索栏。我正在从数据库获取数据。当我搜索数据库中的相应数据时,将根据数据库中json数组获取的长度在回收器视图中添加行数。现在问题来了,当我执行另一次搜索时,从上次搜索生成的行没有删除。感染新行被添加。例如,当我第一次进行搜索时,由于json数组的长度为3,所以添加了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();
}
答案 0 :(得分:0)
当前,您没有在适配器内部修改数据,因此列表只会变大。您无需将适配器设置为null
。您只需要适配器内部的某种方法即可,例如
setData(List<YourData> data) {
dataSet.clear()
dataSet.add(data)
notifyDataSetChanged()
}
从数据库中获取新数据时调用它
答案 1 :(得分:0)
MessageItem = new ArrayList<>();
您应将此代码添加到代码中的for循环之前。
答案 2 :(得分:0)
您需要删除从构造函数向适配器添加数据的过程。所以代替这个
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<>();
}