android - RecyclerView 中的 EditText 值在第 5 个位置后给出相同的值

标签 android scroll android-edittext android-recyclerview

我有一个 RecyclerView,每一行也有一个 EditText。我通过搜索将项目添加到 RecyclerView,然后在编辑文本中输入数量。然后我将它发送到服务器以使用 json 格式存储。项目添加工作正常。滚动时也没有编辑文本值交换问题。我可以在屏幕上显示 5 行。
问题是当我将项目发送到服务器时,底部行中的编辑文本值在第 5 行后变得相同。 这些是我添加到发送到服务器的 recyclerview.Printed 列表的行。

Item : 7.50-15 10PR FM CEAT               Quantity : 1
Item : 5.60-15 04PR K 511 CEAT            Quantity : 2
Item : 2.75-18 04PR SECURA F85 CEAT (F)   Quantity : 3
Item : 3.00-17 06PR SECURA ZOOM CEAT (R)  Quantity : 4
Item : 6.50-14 10PR FM CEAT               Quantity : 5
Item : 5.00-12 04PR GRIP MASTER CEAT      Quantity : 5
Item : 4.00-08 06PR AUTO RAJA RPG         Quantity : 5
Item : 9.00-20 14PR CEAT CLT LUG          Quantity : 5
Item : 8.25-20 14PR TR PLUS SUNTRAC       Quantity : 5
Item : 7.00-15 12PR FM CEAT               Quantity : 5

第5个位置后数量相同。我的输入值没有出现。

这是我的 SelectItem 类 -

public class SelectItem extends AppCompatActivity implements SelectItemAdapter.OnItemClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.select_item);

        vollySingleton = VollySingleton.getsInstance();
        requestQueue = vollySingleton.getmRequestQueue();

        toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setHomeButtonEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        myRecyclerView = (RecyclerView) findViewById(R.id.selectedItemRecyclerView);
        linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);

        spinner = (Spinner) findViewById(R.id.selectDistribChannel);
        arrayAdapter = new ArrayAdapter<String>(this, R.layout.spinner_item, YourDealerListFragment.disChannel);
        arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(arrayAdapter);
        selectedDisChannel = spinner.getSelectedItem().toString();

        sqLiteHandler = new SQLiteHandler(getApplicationContext());

        myRecyclerViewAdapter = new SelectItemAdapter(this);
        myRecyclerViewAdapter.setOnItemClickListener(this);
        myRecyclerView.setAdapter(myRecyclerViewAdapter);
        myRecyclerView.setLayoutManager(linearLayoutManager);
        myRecyclerViewAdapter.notifyDataSetChanged();

        dealerName = DealerListAdapter.getDealerName();
        dealerID = DealerListAdapter.getDealerID();
        repID = DealerListAdapter.getRepID();

        //order number
        orderId = "70000001";

        if (newOrderId == null) {
            newOrderId = orderId;
        }

        bAdd = (Button) findViewById(R.id.bAdd);

        bAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (myRecyclerViewAdapter.getItemCount() != 0) {
                    new AlertDialog.Builder(SelectItem.this)
                            .setTitle("Confirmation")
                            .setMessage("Do you want to send?")
                            .setIcon(android.R.drawable.ic_dialog_alert)
                            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                                public void onClick(DialogInterface dialog, int whichButton) {
                                    checkOrderNo();
                                }
                            })
                            .setNegativeButton(android.R.string.no, null).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Empty List", Toast.LENGTH_SHORT).show();
                }
            }
        });

        //textView.setText(dealerName);
        getSupportActionBar().setTitle(dealerName);

        final AutoCompleteTextView acTextView = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);

        adapter = new MaterialSuggestionAdapter(getApplicationContext());
        acTextView.setAdapter(adapter);
        acTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Product result = adapter.getItem(position);
                String newName = result.getMatName().toString();
                String newQty = String.valueOf(result.getMatQuantity());
                String newPCode = result.getMatNo().toString();
                String newPlant = result.getMatPlant().toString();

                if (!newName.equals("")) {
                    if (myRecyclerViewAdapter.getItemCount() > 0) {

                        if (!isPresent(newPlant, newPCode, myRecyclerViewAdapter)) {
                            myRecyclerViewAdapter.add(1, newName, newQty, newPCode, newPlant);
                        } else {
                            Toast.makeText(getApplicationContext(), "Product Already in the List", Toast.LENGTH_SHORT).show();
                        }

                    } else {
                        myRecyclerViewAdapter.add(0, newName, newQty, newPCode, newPlant);
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "Invalied Item!", Toast.LENGTH_SHORT).show();
                }
                acTextView.setText("");
            }
        });


    }

    private boolean isPresent(String newPlant, String newPCode, SelectItemAdapter myRecyclerViewAdapter) {
        boolean isPresent = false;
        for (int i = 0; i < myRecyclerViewAdapter.getItemCount(); i++) {
            if (newPCode.equalsIgnoreCase(myRecyclerViewAdapter.getItemPCode(i).toString()) && newPlant.equalsIgnoreCase(myRecyclerViewAdapter.getItemPlant(i).toString())) {
                isPresent = true;
                break;
            }
        }
        return isPresent;
    }

    //send items for one order
    private class SendItemAsync extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            //Create JSON string start
            json_string = "{\"sending_items\":[";

            for (int i = 0; i < myRecyclerViewAdapter.getItemCount(); i++) {

               /* if (myRecyclerView.findViewHolderForLayoutPosition(i) instanceof SelectItemAdapter.ItemHolder) {
                    SelectItemAdapter.ItemHolder childHolder = (SelectItemAdapter.ItemHolder) myRecyclerView.findViewHolderForLayoutPosition(i);
                    numberPickerNumber = childHolder.getQtyNumber();
                }*/

                getNumPicNumber(i);

                //Repeat and loop this until all objects are added (and add try+catch)
                try {
                    JSONObject obj_new = new JSONObject();
                    obj_new.put("order_no", orderIdForItemTable);
                    obj_new.put("items", myRecyclerViewAdapter.getItemName(i).toString());
                    obj_new.put("items_no", myRecyclerViewAdapter.getItemPCode(i).toString());
                    obj_new.put("plant", myRecyclerViewAdapter.getItemPlant(i).toString());
                    obj_new.put("quantity", numberPickerNumber);
                    json_string = json_string + obj_new.toString() + ",";

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            //Close JSON string
            json_string = json_string.substring(0, json_string.length() - 1);
            json_string += "]}";

            HttpParams httpParams = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParams, 3500);
            HttpConnectionParams.setSoTimeout(httpParams, 1000);
            HttpClient client = new DefaultHttpClient(httpParams);

            String url = AppConfig.URL_ITEMS_SEND;

            HttpPost request = new HttpPost(url);
            try {
                request.setEntity(new ByteArrayEntity(json_string.getBytes("UTF8")));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            request.setHeader("json", json_string);
            request.setHeader("Accept", "application/json");
            request.setHeader("Content-Type", "application/json");
            Log.i("", "excuting request");
            HttpResponse response = null;
            try {
                response = client.execute(request);
                Log.d("HTTP Response", response.getStatusLine().toString());
                try {
                    String responseBody = EntityUtils.toString(response.getEntity());
                    Log.d("Server Response", responseBody);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();

            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            finish();
            Bundle basket = new Bundle();
            basket.putString("dealerName", dealerName);
            basket.putString("orderNo", newOrderId);
            basket.putString("jsonString", json_string);
            Intent intent = new Intent(SelectItem.this, ItemCart.class);
            intent.putExtras(basket);
            startActivity(intent);
            finish();
            //Toast.makeText(getApplicationContext(), json_string, Toast.LENGTH_LONG).show();
        }
    }

    private String getNumPicNumber(int i) {
        if (myRecyclerView.findViewHolderForLayoutPosition(i) instanceof SelectItemAdapter.ItemHolder) {
            SelectItemAdapter.ItemHolder childHolder = (SelectItemAdapter.ItemHolder) myRecyclerView.findViewHolderForLayoutPosition(i);
            numberPickerNumber = childHolder.getQtyNumber();
        }
        return numberPickerNumber;
    }

    @Override
    public void onItemClick(SelectItemAdapter.ItemHolder item, int position) {
        Toast.makeText(this,
                "Remove " + position + " : " + item.getItemName(),
                Toast.LENGTH_SHORT).show();
        myRecyclerViewAdapter.remove(position);
    }

    private void checkOrderNo() {

        showDialog();

        DateFormat df = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
        final String nowDate = df.format(new Date());

        //final day of the month
        Date today = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(today);
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.add(Calendar.DATE, -1);
        Date lastDayOfMonth = calendar.getTime();
        DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        final String lastDate = sdf.format(lastDayOfMonth);

        Log.d("Last day ", sdf.format(lastDayOfMonth) + " // Today" + nowDate);


        // Tag used to cancel the insert
        String tag_string_req = "req_insert";

        final StringRequest strReq = new StringRequest(Request.Method.POST,
                AppConfig.URL_ITEM_DETAILS_SEND, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                hideDialog();
                try {
                    JSONObject jObj = new JSONObject(response);
                    if (jObj.names().get(0).equals("found")) {

                        newOrderId = jObj.getString("found").toString();
                        orderIdForItemTable = newOrderId;

                        new SendItemAsync().execute();

                        Log.d(TAG, "newOrderId: " + newOrderId);
                        Log.d(TAG, "New repID 2 inserted into sqlite: " + newOrderId + " " + nowDate);
                        sqLiteHandler.addItemDetails(newOrderId, repID, dealerID, nowDate, lastDate, selectedDisChannel);

                    } else {
                        Toast.makeText(getApplicationContext(), "Invalied Request", Toast.LENGTH_SHORT).show();
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "Inserting Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
            }
        }) {

            @Override
            protected Map<String, String> getParams() {
                // Posting params to register url
                Map<String, String> params = new HashMap<String, String>();
                params.put("order_no", orderId);
                params.put("repID", repID);
                params.put("dealerID", dealerID);
                params.put("nowDate", nowDate);
                params.put("lastDate", lastDate);
                params.put("disChannel", selectedDisChannel);

                return params;
            }
        };

        strReq.setRetryPolicy(new DefaultRetryPolicy(6000, 1,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
    }  
}

我的适配器类。

public class SelectItemAdapter extends RecyclerView.Adapter<SelectItemAdapter.ItemHolder> {

    private List<String> itemsName, itemsQty, itemsPCode, itemPlant;
    private OnItemClickListener onItemClickListener;
    private LayoutInflater layoutInflater;
    private RecyclerView myRecyclerview;

    public SelectItemAdapter(Context context) {
        layoutInflater = LayoutInflater.from(context);
        itemsName = new ArrayList<String>();
        itemsQty = new ArrayList<String>();
        itemsPCode = new ArrayList<String>();
        itemPlant = new ArrayList<String>();
    }

    @Override
    public SelectItemAdapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = layoutInflater.inflate(R.layout.custom_row_selected_item, parent, false);
        return new ItemHolder(itemView, this);
    }

    @Override
    public void onBindViewHolder(SelectItemAdapter.ItemHolder holder, int position) {
        holder.setItemName(itemsName.get(position));
        holder.setItemQty(itemsQty.get(position));
        holder.setItemPCode(itemsPCode.get(position));
        holder.setItemPlant(itemPlant.get(position));

    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }


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

    public Object getItemName(int position) {
        return itemsName.get(position);
    }

    public Object getItemPCode(int position) {
        return itemsPCode.get(position);
    }

    public Object getItemPlant(int position) {
        return itemPlant.get(position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        onItemClickListener = listener;
    }

    public OnItemClickListener getOnItemClickListener() {
        return onItemClickListener;
    }


    public interface OnItemClickListener {
        public void onItemClick(ItemHolder item, int position);
    }

    public void add(int location, String iName, String iQty, String iPCode, String iPlant) {
        itemsName.add(location, iName);
        itemsQty.add(location, iQty);
        itemsPCode.add(location, iPCode);
        itemPlant.add(location, iPlant);
        notifyItemInserted(location);
    }

    public void remove(int location) {
        if (location >= itemsName.size())
            return;

        itemsName.remove(location);
        notifyItemRemoved(location);
    }

    public static class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private SelectItemAdapter parent;
        TextView textItemName, txtPCode, txtAvailableQty, txtTempQty, txtPlant;
        Button bRemove;
        EditText numPicker;

        public ItemHolder(View itemView, SelectItemAdapter parent) {
            super(itemView);
            this.parent = parent;
            textItemName = (TextView) itemView.findViewById(R.id.txtProductName);
            txtAvailableQty = (TextView) itemView.findViewById(R.id.txtAvailbleQty);
            txtPCode = (TextView) itemView.findViewById(R.id.txtPCode);
            txtPlant = (TextView) itemView.findViewById(R.id.txtPlant);
            bRemove = (Button) itemView.findViewById(R.id.bRemove);
            numPicker = (EditText) itemView.findViewById(R.id.numberPicker);

            bRemove.setOnClickListener(this);
        }


        public void setItemName(CharSequence name) {
            textItemName.setText(name);
        }

        public void setItemQty(CharSequence name) {
            txtAvailableQty.setText(name);
        }

        public void setItemPCode(CharSequence name) {
            txtPCode.setText(name);
        }

        public void setItemPlant(CharSequence name) {
            txtPlant.setText(name);
        }

        public String getQtyNumber() {
            return numPicker.getText().toString();
        }

        public CharSequence getItemName() {
            return textItemName.getText();
        }


        public CharSequence getItemPCode() {
            return txtPCode.getText();
        }

        @Override
        public void onClick(View v) {
            final OnItemClickListener listener = parent.getOnItemClickListener();
            if (listener != null) {
                listener.onItemClick(this, getPosition());
            }
        }
    }

}

最佳答案

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull List<Object> payloads) {
    super.onBindViewHolder(holder, position, payloads);

    holder.setIsRecyclable(false);// set this in your adapter class as like it is

}

关于android - RecyclerView 中的 EditText 值在第 5 个位置后给出相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37066412/

相关文章:

java - Android EditText 中的对齐问题

java - 当 Activity 被销毁然后重新创建时,未调用观察者并且后值无法从后台线程工作

android - 将对象作为参数从 Activity 传递到 fragment 的问题

Android Eclipse - move 项目导致所有 R 引用错误

android - 如何在EditText中添加两个drawableRight?

android - EditText 的边框?

java - 带有 BindingAdapter 的 MutableLiveData 不更新 View 的可见性

ios - UITableview Scroll 删除 UITableviewcell 内文本字段中的数据

objective-c - 惯性滚动和-ScrollWheel : on OS X

android - 图库事件到 "when image centered"