Android - 使用ArrayList作为Holder防止RecyclerView中的重复项

问题描述 投票:0回答:1

我使用ArrayList来保存要在RecyclerView中显示的对象。代码如下。

private ArrayList<BagLotNumberModel> bagLotNumbers = new ArrayList<>();

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_antam_incoming);

    bagLotNumberRestService = RestApiUtils.getBagLotNumberRestService();

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

    setUpRecyclerView();
}

 private void setUpRecyclerView() {
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyler_view_antam_incoming);
    bagLotNumberAdapter = new BagLotNumberAdapter(bagLotNumbers);

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setAdapter(bagLotNumberAdapter);
    recyclerView.setHasFixedSize(true);
}

CONSTRUCTOR

public class BagLotNumberModel {

    @SerializedName("id")
    public int id;

    @SerializedName("bagNumber")
    public int bagNumber;

    @SerializedName("lotNumber")
    public String lotNumber;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getBagNumber() {
        return bagNumber;
    }

    public void setBagNumber(int bagNumber) {
        this.bagNumber = bagNumber;
    }

    public String getLotNumber() {
        return lotNumber;
    }

    public void setLotNumber(String lotNumber) {
        this.lotNumber = lotNumber;
    }
}

适配器

public class BagLotNumberAdapter extends RecyclerView.Adapter<BagLotNumberAdapter.BagLotNumberViewHolder> {

    private ArrayList<BagLotNumberModel> dataList;

    public BagLotNumberAdapter(ArrayList<BagLotNumberModel> dataList) {
        this.dataList = dataList;
    }

    @NonNull
    @Override
    public BagLotNumberViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.adapter_antam_bag_layout_number, parent, false);
        return new BagLotNumberViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull BagLotNumberViewHolder holder, int position) {
        holder.txtId.setText(String.valueOf(dataList.get(position).getId()));
        holder.txtBagNumber.setText(String.valueOf(dataList.get(position).getBagNumber()));
        holder.txtLotNumber.setText(dataList.get(position).getLotNumber());
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    class BagLotNumberViewHolder extends RecyclerView.ViewHolder {

        TextView txtId, txtBagNumber, txtLotNumber;

        BagLotNumberViewHolder(View itemView) {
            super(itemView);
            txtId = (TextView) itemView.findViewById(R.id.txt_id_bag);
            txtBagNumber = (TextView) itemView.findViewById(R.id.txt_bag_number);
            txtLotNumber = (TextView) itemView.findViewById(R.id.txt_lot_number);
        }
    }
}

通过使用Client Rest API的改进,应用程序使用GET搜索项目。代码如下。

改造

private void doGetRestBagLotNumber(int bagNumber, String lotNumber, final BagLotNumberRestService callback) {
    Call<BagLotNumberModel> call = bagLotNumberRestService.getAntamBagLotNumber(bagNumber, lotNumber);
    call.enqueue(new Callback<BagLotNumberModel>() {
        @Override
        public void onResponse(Call<BagLotNumberModel> call, Response<BagLotNumberModel> response) {

            if (response.code() == 404 || response.code() == 422) {
                callback.onSuccess(false, "Not Found");
            } else {
                int id = response.body().getId();
                int bagNumber = response.body().getBagNumber();
                String lotNumber = response.body().getLotNumber();

                // Dynamically adding element to RecyclerView
                preparedObjectDataBagLotNumber(id, bagNumber, lotNumber);
                callback.onSuccess(response.body() != null, "Found");
            }
        }

        @Override
        public void onFailure(Call<BagLotNumberModel> call, Throwable t) {
            Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

private void preparedObjectDataBagLotNumber(int id, int bagNumber, String lotNumber) {
    BagLotNumberModel bagLotNumberModel = new BagLotNumberModel();
    bagLotNumberModel.setId(id);
    bagLotNumberModel.setBagNumber(bagNumber);
    bagLotNumberModel.setLotNumber(lotNumber);
    bagLotNumbers.add(bagLotNumberModel);
    bagLotNumberAdapter.notifyDataSetChanged();

}

并要求上述功能。

doGetRestBagLotNumber(
    Integer.parseInt(bagNumber.getText().toString()), lotNumber.getText().toString(),
    new BagLotNumberRestService() {
        @Override
        public void onSuccess(boolean value, String message) {

            if (value) {
                ((TextView) promptsView.findViewById(R.id.textViewTickMsgAntamIncoming))
                        .setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_check_green_24dp, 0, 0, 0);
                ((TextView) promptsView.findViewById(R.id.textViewTickMsgAntamIncoming))
                        .setText(message);
            } else {
                ((TextView) promptsView.findViewById(R.id.textViewTickMsgAntamIncoming))
                        .setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_sentiment_dissatisfied_red_24dp, 0, 0, 0);
                ((TextView) promptsView.findViewById(R.id.textViewTickMsgAntamIncoming))
                        .setText(message);
            }


            promptsView.findViewById(R.id.editTextDialogAntamBagNumber).requestFocus();
            promptsView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    ((TextView) promptsView.findViewById(R.id.textViewTickMsgAntamIncoming)).setText("");
                    ((TextView) promptsView.findViewById(R.id.textViewTickMsgAntamIncoming))
                            .setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
                }
            }, 5000);
        }

        @Override
        public Call<BagLotNumberModel> getAntamBagLotNumber(int bagNumber, String lotNumber) {
            return null;
        }
    }

);

我的问题是:在应用程序向列表中添加新元素之前,应用程序如何检查具有特定属性的对象是否已存在?那么,在recyclerView中没有重复的元素?

活动更新

private void setUpRecyclerView() {
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyler_view_antam_incoming);
    bagLotNumberAdapter = new BagLotNumberAdapter(this, bagLotNumbers);

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setAdapter(bagLotNumberAdapter);
    recyclerView.setHasFixedSize(true);
    ItemTouchHelper itemTouchHelper = new
            ItemTouchHelper(new SwipeToDeleteBagLotNumberCallback(bagLotNumberAdapter));
    itemTouchHelper.attachToRecyclerView(recyclerView);
}

新适配器

public class BagLotNumberAdapter extends RecyclerView.Adapter<BagLotNumberAdapter.BagLotNumberViewHolder> {

    Context context;
    private ArrayList<BagLotNumberModel> dataList;

    public BagLotNumberAdapter(Context c, ArrayList<BagLotNumberModel> dataList) {
        this.context = c;
        this.dataList = dataList;

    }

    ArrayList<BagLotNumberModel> newList = new ArrayList<BagLotNumberModel>();
    private ArrayList<BagLotNumberModel> removeDuplicates(ArrayList<BagLotNumberModel> list) {
        for (BagLotNumberModel element : list) {
            if (!newList.contains(element)) {
                newList.add(element);
            }
        }
        return newList;
    }

    @NonNull
    @Override
    public BagLotNumberViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.adapter_antam_bag_layout_number, parent, false);
        return new BagLotNumberViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull BagLotNumberViewHolder holder, int position) {

        removeDuplicates(dataList);
        holder.txtId.setText(String.valueOf(dataList.get(position).getId()));
        holder.txtBagNumber.setText(String.valueOf(dataList.get(position).getBagNumber()));
        holder.txtLotNumber.setText(dataList.get(position).getLotNumber());
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    class BagLotNumberViewHolder extends RecyclerView.ViewHolder {
        TextView txtId, txtBagNumber, txtLotNumber;
        BagLotNumberViewHolder(View itemView) {
            super(itemView);
            txtId = (TextView) itemView.findViewById(R.id.txt_id_bag);
            txtBagNumber = (TextView) itemView.findViewById(R.id.txt_bag_number);
            txtLotNumber = (TextView) itemView.findViewById(R.id.txt_lot_number);
        }
    }

    public Context getContext() {
        return context;
    }

    private BagLotNumberModel mRecentlyDeletedItem;
    private int mRecentlyDeletedItemPosition;

    void deleteItem(int position) {
        mRecentlyDeletedItem = dataList.get(position);
        mRecentlyDeletedItemPosition = position;
        dataList.remove(position);
        notifyItemRemoved(position);
        showUndoSnackBar();
    }

    private void showUndoSnackBar() {
        String defaultContextName = context.getClass().getSimpleName();
        View view = null;
        switch (defaultContextName) {
            case "AntamIncomingActivity":
                view = (View) ((AntamIncomingActivity) context).findViewById(R.id.coordinator_layout_antam_incoming);
                break;
            default:
                break;
        }

        assert view != null;
        Snackbar snackbar = Snackbar.make(view, "Undo ?",
                Snackbar.LENGTH_LONG);
        snackbar.setAction("Undo ", v -> undoDelete());
        snackbar.show();
    }

    private void undoDelete() {
        dataList.add(mRecentlyDeletedItemPosition,
                mRecentlyDeletedItem);
        notifyItemInserted(mRecentlyDeletedItemPosition);
    }

}

截图

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".activity.antam.AntamIncomingActivity"
    tools:showIn="@layout/activity_antam_incoming">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyler_view_antam_incoming"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:scrollbars="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

Updated

更新2

enter image description here

java android
1个回答
0
投票

在将arrayList传递给适配器之前,您可以使用removeDuplicates函数。

 bagLotNumberAdapter = new BagLotNumberAdapter(removeDuplicates(bagLotNumbers));

removeDuplicates函数

// Create a new ArrayList 
 ArrayList<BagLotNumberModel> newList = new ArrayList<BagLotNumberModel>(); 

 public ArrayList<BagLotNumberModel> removeDuplicates(ArrayList<BagLotNumberModel> list) 
  { 
      for (BagLotNumberModel element : list) {

         if (!newList.contains(element)) { 
               newList.add(element); 
          } 

    }
       return newList; 
 } 

编辑

newList = removeDuplicates(dataList);
holder.txtId.setText(String.valueOf(newList.get(position).getId()));
holder.txtBagNumber.setText(String.valueOf(newList.get(position).getBagNumber()));
holder.txtLotNumber.setText(newList.get(position).getLotNumber());

推荐问答