首页 > 解决方案 > 在回收站视图中删除子布局行

问题描述

在我的 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();
}

标签: androidandroid-recyclerview

解决方案


您需要从构造函数中删除向适配器添加数据。所以代替这个

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

推荐阅读