【问题标题】:How to get the textview values from recyclerview for each item row如何从 recyclerview 获取每个项目行的 textview 值
【发布时间】:2019-07-16 05:28:44
【问题描述】:

我有 recyclerview,我在其中显示项目名称、项目率和项目数量,这些项目分别通过 +/- 按钮增加和减少。现在,我想从 recyclerview 的每个项目中获取所有值并将其发送到服务器或将其保存到本地数据库,那么如何实现呢?

//这是我的适配器类

公共类 TeaListAdapter 扩展 RecyclerView.Adapter {

    //private int num=0;
    private List<TeaListPOJO> teaItemList;
    private Context mContext;
    private Cursor cursor;
    int comboCount;

    HashMap<Object,Integer> selectedMap = new HashMap ();

    private String ItemName;
    private String itemrate;
    private String qty;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView tvitemName, tvitemRate,tvcount; //number
        public ImageView ivItemImg,ivPlus,ivMinus;
        public Button btnIncrease,btnDecrease;
        RecyclerView.ViewHolder holder;


        public MyViewHolder(View view) {
            super(view);
            tvitemName = (TextView) view.findViewById(R.id.txt_item_name);
            tvitemRate = (TextView) view.findViewById(R.id.txt_item_price);
            ivItemImg= (ImageView) view.findViewById (R.id.iv_item);
            ivPlus=(ImageView) view.findViewById (R.id.row_view_final_order_iv_plus);
            ivMinus=(ImageView) view.findViewById (R.id.row_view_final_order_iv_minus);
            tvcount=(TextView) view.findViewById (R.id.row_view_final_order_tv_count);
        }
    }


    public TeaListAdapter(List<TeaListPOJO> teaItemList) {
        this.mContext=mContext;
        this.cursor=cursor;
        this.teaItemList = teaItemList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.rv_placeorder_items, parent, false);

        return new MyViewHolder (itemView);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {

        TeaListPOJO tealist = teaItemList.get(position);
        holder.tvitemName.setText(tealist.getItemName ());
        holder.tvitemRate.setText(AppConstants.INDIAN_RUPEE_SIGN.concat (tealist.getItemRate ()));

        holder.ivPlus.setOnClickListener (new View.OnClickListener () {
            @Override
            public void onClick(View view) {
                int count=0;
                try{
                    count = Integer.parseInt(holder.tvcount.getText().toString());
                }
                catch(Exception e) {
                    count = 0;
                }
                //count++;
                count = Integer.parseInt(holder.tvcount.getText().toString());
                holder.tvcount.setText(String.valueOf(count+ 1));
            }

        });

        holder.ivMinus.setOnClickListener (new View.OnClickListener () {
            @Override
            public void onClick(View view) {
                int count=0;
                try{

                    count = Integer.parseInt(holder.tvcount.getText().toString());
                }
                catch(Exception e) {
                    count = 0;
                }
                if(count>0) {
                    //count--;
                    count = Integer.parseInt (holder.tvcount.getText ().toString ());
                    holder.tvcount.setText (String.valueOf (count - 1));
                }
            }

        });

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

            }
        });

       /* Intent intent = new Intent (mContext, PlaceOrderActivity.class);
        //            intent.putExtra("quantity",Integer.parseInt(quantity.getText().toString()));
        intent.putExtra ("quantity", qty);
        intent.putExtra ("item", ItemName);
        intent.putExtra ("itemrate", itemrate);

         ItemName = holder.tvitemName.getText().toString();
         qty = holder.tvcount.getText().toString();
         itemrate=holder.tvitemRate.getText ().toString ();

        Log.e("rate",itemrate);
        Log.e("qty",qty);*/


        byte[] decodedString = new byte[0];
        try {

            decodedString = Base64.decode(tealist.getImageStr(), Base64.DEFAULT);
            // tenantModelPOJO.setLogo(decodedString);
            Bitmap bmp = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
            holder.ivItemImg.setImageBitmap(Bitmap.createScaledBitmap(bmp, 50, 50,false));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    @Override
    public int getItemCount() {

        return teaItemList.size();
    }

}

//这是我的活动类

公共类 PlaceOrderActivity 扩展 AppCompatActivity 实现 AppConstants、View.OnClickListener、WLAPIcalls.OnAPICallCompleteListener {

private List<TeaListPOJO> teaList = new ArrayList<> ();
private RecyclerView recyclerView;
private TeaListAdapter mAdapter;
private View view;
private Button btnPlaceorder;
EditText edtmsg;

public String str;

private Context mContext = PlaceOrderActivity.this;
private int itemCount;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate (savedInstanceState);
    setContentView (R.layout.activity_place_order);
    str=getIntent ().getStringExtra ("quantity");
    edtmsg= (EditText) view.findViewById (R.id.et_message);
    edtmsg.setText (str);

    setRecyclerView (view);
    getallTeaItems ();
}

List<TeaListPOJO> getTeaItemList(String str) {
    Gson gson = new Gson ();
    Type listType = new TypeToken<List<TeaListPOJO>> () {
    }.getType ();
    List<TeaListPOJO> myModelList = gson.fromJson (str, listType);
    return myModelList;
}

private List<TeaListPOJO> getallTeaItems() {
    if (new AppCommonMethods (mContext).isNetworkAvailable ()) {
        WLAPIcalls mAPIcall = new WLAPIcalls (mContext, getString (R.string.getTeaItem), this);
        mAPIcall.GetTeaItemList ();
    } else {
        Toast.makeText (mContext, R.string.no_internet, Toast.LENGTH_SHORT).show ();
    }
    return null;
}


void setRecyclerView(View view) {
    recyclerView = (RecyclerView) findViewById (R.id.recycler_view);
    mAdapter = new TeaListAdapter (teaList);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager (getApplicationContext ());
    recyclerView.setLayoutManager (mLayoutManager);
    recyclerView.setItemAnimator (new DefaultItemAnimator ());
    recyclerView.setAdapter (mAdapter);
}

@Override
public void onClick(View view) {

}

@Override
public void onAPICallCompleteListner(Object item, String flag, String result) throws JSONException {
    if (getString (R.string.getTeaItem).equals (flag)) {
        Log.e ("Result", result);
        teaList = getTeaItemList (result);
        setRecyclerView (view);

    }

}

}

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    在您的 TeaListPOJO 模型中添加一个额外的属性,例如 count,当您按下 +/- 按钮时,您必须在模型中设置计数,就像在文本视图中设置计数一样。因此,在您的适配器中,您有 TeaListPOJO 列表。显示何时要将数据发送到服务器获取TeaListPOJO 的列表,并且您还有计数列表。

    【讨论】:

      【解决方案2】:

      在适配器中设置对 API 的调用以更改 DB 中的值。 您不需要传递整个数据,通常您可以通过在 URL 中传递 id 来更新您正在查看的一个对象。 例如 https://hostname.domain/api/object/ID 使用 PUT 请求并从该行中的对象传递信息。

      如果您也在创建它的后端,那么我强烈建议您进行设置,因为为所有行传递整个数据集并不是一个理想的解决方案。

      如果这些首先不存在并且它们都是从应用程序中创建的,那么在您的主要活动上有一个按钮来保存列表,然后将整个列表传递给 API 调用,很可能需要将数据解析为 JSON。 我在这里假设如果是后者,您已经在一个类中创建了这些对象。

      【讨论】:

        【解决方案3】:

        TeaListPOJO 还应该需要一个字段来存储count。当用户单击 + 或 - 按钮时增加或减少 count 值,并将 count 值显示到文本视图,而不是直接显示。

        class TeaListPojo{
            private int count;
            .....
        
            public int getCount()
                return this.count
            }
        
            public void setCount(int count)
            {
                this.count = count;
            }
        }
        

        这里是更新count textview的代码

        public void onBindViewHolder(final MyViewHolder holder, final int position) {
        
            TeaListPOJO tealist = teaItemList.get(position);
        
            .....
            .....
        
            holder.ivPlus.setOnClickListener (new View.OnClickListener () {
                @Override
                public void onClick(View view) {
                    tealist.setCount( tealist.getCount() + 1);
                    holder.tvcount.setText(String.valueOf(count));
                }
        
            });
        
            holder.ivMinus.setOnClickListener (new View.OnClickListener () {
                @Override
                public void onClick(View view) {
                        tealist.setCount(tealist.getCount() - 1)
                        holder.tvcount.setText (String.valueOf (count));
                    }
                }
        
            });
        }
        

        【讨论】:

        • 如何设置计数并将其传递给 textview
        • 你应该增加或减少count的值,我将添加一个伪代码
        • 我已经添加了代码,也可以给出一个条件来防止计数变为负数
        • 它是一个伪代码,不要在你的项目中使用确切的代码,看看我在 OnClickListerner 中做了什么
        • 我没有完全使用代码,我只是尝试将 count 的值设置为 textview,但是在单击按钮时它无法正常工作
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多