在回收者视图中删除子布局行

时间:2020-01-27 09:06:18

标签: android android-recyclerview

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

3 个答案:

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