【问题标题】:Getting values from RecyclerView EditText?从 RecyclerView EditText 获取值?
【发布时间】:2019-07-04 23:27:11
【问题描述】:

我对 recyclerView 印象深刻,

这里的名称和余额字段来自两个不同的数组。 我需要的是,这里每一行都有一个 EditText 字段。我需要访问每一行上的每个 EditText。并从中获取值.. 总计会显示在 Total textView 上。可能吗?我尝试了很多。没听懂。

我在这里附上我的课程。

MainActivity

public class GroupCollectionFragment extends Fragment {
String[] nameArray = {"Akhil","Mohan","Anoop","Syam","Athul","Anish","Anand","Prasad","Mani","Oommen"
        ,"Akhil","Mohan","Anoop","Syam","Athul","Anish","Anand","Prasad","Mani","Oommen"
        ,"Akhil","Mohan","Anoop","Syam","Athul","Anish","Anand","Prasad","Mani","Oommen"};
String[] balanceArray={"2354","6578","2345","34654","2542","2354","6578","2345","34654","2542"
        ,"2354","6578","2345","34654","2542","2354","6578","2345","34654","2542"
        ,"2354","6578","2345","34654","2542","2354","6578","2345","34654","2542"};
RecyclerView mRecyclerView;
RecyclerView.Adapter mAdapter;
LinearLayoutManager mLayoutManager;
List<DataHolder> holderList=new ArrayList<DataHolder>();

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootview=inflater.inflate(R.layout.group_collection_layout,container,false);
    mRecyclerView = (RecyclerView) rootview.findViewById(R.id.my_recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(getContext());
    mRecyclerView.setLayoutManager(mLayoutManager);
    setItems();
    mAdapter = new Adapter(holderList);
    mRecyclerView.setAdapter(mAdapter);
    return rootview;
}

private void setItems() {

    for(int i=0;i<nameArray.length;i++){
        DataHolder item=new DataHolder();
        item.setDname(nameArray[i]);
        item.setDbalance(balanceArray[i]);
        holderList.add(item);
    }
}

}

数据持有者

public class DataHolder {

String dname,dbalance;
public DataHolder(){
}
public String getDname(){
    return dname;
}
public void setDname(String name){
    this.dname=name;
}
public String getDbalance(){
    return dbalance;
}
public void setDbalance(String balance){
    this.dbalance=balance;
}

}

适配器

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
private List<DataHolder> mDataSet;

public static class ViewHolder extends RecyclerView.ViewHolder{
    private TextView anameTxtView,abalanceTxtView;
    private EditText adepositEditText;
    public ViewHolder(View v){
        super(v);
        anameTxtView=(TextView)v.findViewById(R.id.nameTextView);
        abalanceTxtView=(TextView)v.findViewById(R.id.balanceTextView);
        adepositEditText=(EditText)v.findViewById(R.id.depositEditText);
    }
}

public Adapter(List<DataHolder> myData){
    mDataSet=myData;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v=LayoutInflater.from(parent.getContext()).inflate(R.layout.row_main,parent,false);
    ViewHolder vh=new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.anameTxtView.setText(mDataSet.get(position).getDname());
    holder.abalanceTxtView.setText(mDataSet.get(position).getDbalance());


}

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

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

}

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    我认为您正在寻找回调,这意味着每当 EditTexts 之一上的数字发生更改时,您也希望总数更改。 所以首先你需要添加一个接口,

    OnEditTextChanged 接口

    public interface OnEditTextChanged {
        void onTextChanged(int position, String charSeq);
    }
    

    那么你也需要在适配器的构造函数中包含这个。

    在 Adapter.java 中

    private List<DataHolder> mDataSet;
    private OnEditTextChanged onEditTextChanged;
    
    public Adapter(List<DataHolder> myData, OnEditTextChanged onEditTextChanged) {
        mDataSet = myData;
        this.onEditTextChanged = onEditTextChanged;
    }
    

    在适配器的 onBindViewHolder 中,您需要为文本更改设置一个监听器,并使用 onEditTextChanged 对象告诉片段。

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        holder.anameTxtView.setText(mDataSet.get(position).getDname());
        holder.abalanceTxtView.setText(mDataSet.get(position).getDbalance());
    
        holder.adepositEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                onEditTextChanged.onTextChanged(position, charSequence.toString());
            }
    
            @Override
            public void afterTextChanged(Editable editable) {}
        });
    }
    

    将此数组添加到您的 GroupCollectionFragment 中,以便您可以将值保存在片段中并在需要时使用它们。

    Integer[] enteredNumber = new Integer[1000];
    

    在 GroupCollectionFragment 中更改您的构造函数调用

    mAdapter = new Adapter(holderList, new OnEditTextChanged() {
            @Override
            public void onTextChanged(int position, String charSeq) {
                enteredNumber[position] = Integer.valueOf(charSeq);
                updateTotalValue();
            }
        }); 
    
    private void updateTotalValue() {
        int sum = 0;
        for (int i = 0; i < 1000; i++) {
            sum += enteredNumber[i];
        }
    
        totalValue.setText(String.valueOf(sum));
    }
    

    如果您想要整个文件,请告诉我。我写了它并构建了apk,它工作得很好。

    【讨论】:

    • 感谢您的宝贵时间!我会通过它! :) 我也需要那个
    • @BraveHeart 如果我的回答是对的,你会接受吗? :D Adapter.java paste.ubuntu.com/24221230 GroupCollectionFragment.java paste.ubuntu.com/24221236
    • 我在删除文本时出现空异常问题,如果为空应该在哪里检查?
    • 我把初始化改成了这个。 int[] 输入金额 = new int[1000];接着。输入量[位置] = Integer.parseInt(charSeq);私人无效 updateTotalValue() { int sum = 0; //高级for循环 for(int num :enteredAmount) { sum = sum+num; } textViewRemaining.setText(String.valueOf(sum)); }
    • 我可以根据位置给textInputlayout设置错误吗,因为当我尝试设置错误时,它出现在edittext的最后一个位置
    【解决方案2】:

    提高性能的更好方法

    private List<Integer> getQuantityList() {
        List<Integer> quantities = new ArrayList<>();
    
        for (int i = 0; i < cartItems_rv.getChildCount(); i++) {
            quantities.add(Integer.valueOf(((EditText)Objects.requireNonNull(
                    Objects.requireNonNull(cartItems_rv.getLayoutManager()).findViewByPosition(i))
                    .findViewById(R.id.quantity_et)).getText().toString()));
        }
    
        return quantities;
    }
    

    感谢Goku's answers,请随时为您自己的应用塑造方法。

    【讨论】:

    • 很好的解决方案!谢谢。
    【解决方案3】:

    您可以通过键盘的操作获得价值。你所需要的只是设置

    android:imeOptions="actionDone" 在编辑文本中。然后只需使用下面的代码

     adepositEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                    @Override
                    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                        if (actionId == EditorInfo.IME_ACTION_DONE) {
                            // Do whatever you want here
    
                            return true;
                        }
                        return false;
    
                    });
    

    【讨论】:

    • 只有当他们点击done时才会发生这种情况,而且许多用户可能只是点击不同的字段,这意味着您会错过一些更改。
    【解决方案4】:

    EditText 上使用TextChangedListener 并将输入保存在新的HashMap 中,其中键作为订单的ID/行的唯一键。

       adeposit.addTextChangedListener(new TextWatcher() {
    
       public void afterTextChanged(Editable s) {}
    
      public void beforeTextChanged(CharSequence s, int start,
                                    int count, int after) {
      }
    
     public void onTextChanged(CharSequence s, int start,
                               int before, int count) {
      // Save value her in HashMap
      }
    });
    

    最后从HashMap获取值。

    【讨论】:

      【解决方案5】:

      我修改了@MeHdi 的答案。 @MeHdi 的答案几乎没有错误,这将变成一个大问题,当 recyclerview 中向上/向下滚动时,项目位置会发生变化,其值也会发生变化或变空。此外,我在回收站视图的单行中有多个 editText。感谢@MeHdi 的想法。屏幕如下图

      OnEditTextChanged

      public interface OnEditTextChanged {
      // here component_id is editTextId (findView by Id)
      void onTextChanged(int component_id, int position, String charSeq);
      }
      

      在适配器类中全局声明

      private Context context;
      private List<DataModel> dailyLiqdateList;
      private OnEditTextChanged onEditTextChanged;
      

      适配器类

      public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {
      private Context context;
      private List<DataModel> dataList;
      
      private OnEditTextChanged onEditTextChanged;
      
      public MyAdapter(Context mContext, List<DataModel> dataList, OnEditTextChanged onEditTextChanged) {
          this.context = mContext;
          this.dataList = dataList;
          this.onEditTextChanged = onEditTextChanged;
      }
      
      @NonNull
      @Override
      public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
      
          View myHolder = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list,parent,false);
          return new MyHolder(myHolder);
      }
      @Override
      public int getItemCount() {
          return dataList.size();
      }
      
       // This is important method due to which even if you scroll list, editText values will not get changed/empty. This method will maintain its position in recyclerview
      @Override
      public int getItemViewType(int position) {
          return position;
      }
      
      @Override
      public void onBindViewHolder(MyHolder holder, int position) {
      
          holder.bind(dataList.get(position), position);
      
          holder.firstEditText.addTextChangedListener(new TextWatcher() {
              @Override
              public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
      
              @Override
              public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
      
              }
      
              @Override
              public void afterTextChanged(Editable editable) {
                  onEditTextChanged.onTextChanged(R.id.item_firstEditText,position, holder.firstEditText.getText().toString());
              }
          });
      
          holder.secondEditText.addTextChangedListener(new TextWatcher() {
              @Override
              public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
      
              @Override
              public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
      
              }
      
              @Override
              public void afterTextChanged(Editable editable) {
                  onEditTextChanged.onTextChanged(R.id.item_secondEditText, position, holder.secondEditText.getText().toString());
              }
          });
      
      
      }
      
      public class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
          TextView headerName;
          EditText firstEditText, secondEditText;
      
          MyHolder(View itemView) {
              super(itemView);
              headerName = itemView.findViewById(R.id.headerNameTv);
              firstEditText = itemView.findViewById(R.id.item_firstEditText);
              secondEditText = itemView.findViewById(R.id.item_secondEditText);;
      
          }
      
          public void bind(final DataModel dto, int position) {
              if (dto != null) {
                      headerName.setText(dto.getName());
              }
          }
      }
      }
      

      您在其中拥有 recyclerview 的 Activity 类

      // declare these values globally
      Integer[] firstValues, secondValues;
      // Declare textviews for calculating and setting total values
      private TextView firstTotalTv, secondTotalTv;
      
      // Initialize editText values array list, same as dataList size.
      firstValues= new Integer[dataList.size()];
      secondValues= new Integer[dataList.size()];
      
      // setting adapter on recyclerview, write this in onCreate()
      myAdapter = new MyAdapter(thisActivity, dataList, new OnEditTextChanged() {
              @Override
              public void onTextChanged(int component_id, int position, String charSeq) {
                  if (component_id == R.id.item_firstEditText) {
                      if (Utils.isValidStr(charSeq)) {
                          firstValues[position] = Integer.valueOf(charSeq);
      
                      } else {
                          firstValues[position] = null;
                      }
                      updateTotalValue1(firstValues, firstTotalTv);
                  }
      
                  if (component_id == R.id.item_secondEditText) {
                      if (Utils.isValidStr(charSeq)) {
                          secondValues[position] = Integer.valueOf(charSeq);
                      } else {
                          secondValues[position] = null;
                      }
                      updateTotalValue1(secondValues, secondTotalTv);
                  }                
              }
          });
          recyclerView.setAdapter(myAdapter);
      
      
         // Update Method, write outside of onCreate()
         private void updateTotalValue1(Integer[] editTextList, TextView totalTextView) {
          int pSum = 0, c1Sum = 0;
          for (int i = 0; i < editTextList.length; i++) {
              if (editTextList[i] != null)
                  pSum += editTextList[i];
              else if (i == 0 && editTextList[i] == null)
                  pSum = 0;
          }
          if (pSum > 0)
              totalTextView.setText(String.valueOf(pSum));
          else
              totalTextView.setText("");
      }
      

      【讨论】:

      • 你能分享一下 Utils 类吗?
      • public static boolean isValidStr(String string) { return string != null && !string.trim().isEmpty(); } , 在你的 Utils 类中写这个方法
      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 2021-03-12
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多