【问题标题】:Get Data of not visible items from recyclerview adapter从 recyclerview 适配器获取不可见项目的数据
【发布时间】:2020-06-05 16:32:16
【问题描述】:

我需要你们的帮助,任何人都可以解决这个问题我正在尝试将三行插入到 mysql 表中,但是这里只有两行可见,第三行在向下滚动时可见,所以当我点击提交时,它会让我错误它在屏幕上插入 2 个可见行并在不可见的 3 行上抛出一个空指针期望有人可以帮助我从不可见的视图中获取数据我知道它的 recyclerview 并且它重新使用视图我知道机制我只是想要一些解决方案,以便可以将不可见的 3 行成功添加到数据库中

这是一张图片:

https://imgur.com/a/rkARs

我的 recyclerview 适配器代码:

public class MyAdapterClosing extends RecyclerView.Adapter<MyAdapterClosing.myViewHolder> {

    private Context context;
    private List<DataofClosing> student;

    public MyAdapterClosing(Context context, List<DataofClosing> student){
        this.context = context;
        this.student = student;
    }

    @Override
    public myViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layoutclosing,parent,false);
        return new myViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(myViewHolder holder, int position) {
        DataofClosing s = student.get(position);
        holder.brand.setText(s.Brandname);



    }


    public void updateList(List<RecyclerviewWholesale> student)
    {
        student = student;
        notifyDataSetChanged();
    }
    public void addItem(int position, DataofClosing stud)
    {
        student.add(position, stud);
        notifyItemInserted(position);
    }

    public void removeItem(int position) {
        student.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, student.size());
    }



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


    @Override
    public int getItemViewType(int position) {

        return position;
    }



    public class myViewHolder extends RecyclerView.ViewHolder{
        TextView brand;
        EditText qts,pts,nip,ml90;

        public myViewHolder(View itemView) {
            super(itemView);

            brand = (TextView) itemView.findViewById(R.id.brand);
            qts = (EditText) itemView.findViewById(R.id.qts);
            pts = (EditText) itemView.findViewById(R.id.pts);
            nip = (EditText) itemView.findViewById(R.id.nip);
            ml90 = (EditText) itemView.findViewById(R.id.ml90);

            String qtss = qts.getText().toString();
            String ptss = pts.getText().toString();
            String nipp = nip.getText().toString();
            String ml900 = ml90.getText().toString();

            DataofClosing dataofClosing = new DataofClosing();
            dataofClosing.qts = qtss;
            dataofClosing.pts = ptss;
            dataofClosing.nip = nipp;
            dataofClosing.ml90 = ml900;



        }
    }

}

在主Activity中插入代码是:

class Insertclosing extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        /**
         * Creating product
         */
        protected String doInBackground(String... args) {
            for (int i = 0; i < mAdapter.getItemCount(); i++) {
                rcData = data.get(i);
                View view1 = closingService.getChildAt(i);
                EditText nameEditText = (EditText) view1.findViewById(R.id.qts);
                String name = nameEditText.getText().toString();
                EditText ptss = (EditText) view1.findViewById(R.id.pts);
                String pts = ptss.getText().toString();
                EditText nipp = (EditText) view1.findViewById(R.id.nip);
                String nip = nipp.getText().toString();
                EditText ml900 = (EditText) view1.findViewById(R.id.ml90);
                String ml90 = ml900.getText().toString();
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();

                params.add(new BasicNameValuePair("brand", rcData.Brandname));
                params.add(new BasicNameValuePair("quantity", name));
                params.add(new BasicNameValuePair("discount",pts));
                params.add(new BasicNameValuePair("ammount",nip ));


                // getting JSON Object
                // Note that create product url accepts POST method
                JSONObject json = jsonParser.makeHttpRequest(url_insert_product_sales,
                        "POST", params);

                // check log cat fro response
                Log.d("Create Response", json.toString());

                // check for success tag
                try {
                    int success = json.getInt(TAG_SUCCESS);

                    if (success == 1) {
                    /*runOnUiThread(new Runnable() {
                        public void run() {

                            Toast.makeText(ChangeAddress.this, "Order Placed Successfully", Toast.LENGTH_SHORT).show();
                        }
                    });*/
                    } else {
                        runOnUiThread(new Runnable() {
                            public void run() {

                                Toast.makeText(closing.this, "Try Again", Toast.LENGTH_SHORT).show();
                            }
                        });               // failed to create product
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         **/
        protected void onPostExecute(String file_url) {

             Toast.makeText(closing.this, "Closing added Successfully", Toast.LENGTH_SHORT).show();

        }
    }

【问题讨论】:

  • 要拥有RecyclerView,你需要将所有数据都放在List&lt;DataofClosing&gt;,那为什么不直接从列表中获取数据,而不是从RecyclerView中获取呢?
  • 你试过用 包裹它吗?
  • 我没有从列表中获取数据,因为当列表出现时,每个项目都有 4 个编辑文本,我必须将其填满,然后将其保存到数据库中,这就是为什么任何解决方案的原因。 @ZeekHuge
  • 如果我用滚动视图把它包起来会发生什么
  • @SachinLatiyan 你有解决这个问题的办法吗??

标签: android android-recyclerview


【解决方案1】:

我找到了解决方案。 适配器有两种方法

onViewAttachedToWindow(RecyclerView.ViewHolder holder){}

onViewDetachedFromWindow(RecyclerView.ViewHolder holder){}

在你的适配器中创建一个 HashMap

public HashMap<Integer, RecyclerView.ViewHolder> holderHashMap = new HashMap<>();

并在 onDetach 中添加持有者并删除相同的 onAttach。像这样。

 @Override
    public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) {
        holderHashMap.put(holder.getAdapterPosition(),holder);
        super.onViewDetachedFromWindow(holder);
    }

    @Override
    public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
        holderHashMap.remove(holder.getAdapterPosition());
        super.onViewAttachedToWindow(holder);

    }

要访问所有 viewHolders,包括不可见的,请在您的活动中使用它。

for(int i =0; i<recyclerView.getItemCount();i++){
RecyclerView.ViewHolder holder = surveyQuestionList.findViewHolderForAdapterPosition(i);

            if(holder == null){
                holder = adapter.holderHashMap.get(i);
            }
}

这是迄今为止我想出的最好的解决方案。 让我知道它是否适合你。

【讨论】:

  • 我会试试这个我会告诉你它对我有用,顺便说一句谢谢你
  • @SachinLatiyan Cool .. 如果它适合你,请接受答案。
猜你喜欢
  • 1970-01-01
  • 2014-09-22
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多