2017-10-20 59 views
0

中的recyclerview每个项目的列表在我的项目editext场(carname与价格),当我click上的保存需要的时候把所有的字段值成string列表,还我在滚动值互换后输入了值。这是我的代码。如何从recyclerview editext值转换为字符串

private class PricesAdapter extends RecyclerView.Adapter<PricesAdapter.MyViewHolder> { 

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

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    holder.tvCarType.setText(carsList.get(position)); 
    holder.edtPrice.setText(""); 
    holder.edtPrice.setTag(position); 
    } 

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

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

public class MyViewHolder extends RecyclerView.ViewHolder { 

    TextView tvCarType; 
    EditText edtPrice; 

    public MyViewHolder(View itemView) { 
    super(itemView); 
    tvCarType=(TextView)itemView.findViewById(R.id.tvCarType); 
    edtPrice=(EditText)itemView.findViewById(R.id.edtPrice); 
     } 
    } 
    } 
} 

以下是从editext值中获取字符串列表的方法。

public List<string> getPriceValues(){ 
    List<String> priceList = new ArrayList<>(); 

    for (int i = 0; i < carsList.size(); i++) { 

    View viewHolder=rvPrices.getRootView(); 

    View view1=mLayoutManager.findViewByPosition(i); 
    View view=rvPrices.getChildAt(i); 
    View root=rvPrices.getRootView(); 
    //   PricesAdapter.MyViewHolder myViewHolder=(PricesAdapter.MyViewHolder)rvPrices.findViewHolderForLayoutPosition(i); 
      //   String price=myViewHolder.edtPrice.getText().toString().trim(); 
    EditText edtPrice=(EditText) view.findViewById(R.id.edtPrice); 
    String price = edtPrice.getText().toString().trim(); 
    priceList.add(price); 
    }      
    return priceList; 
} 

这是我的错误。

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
+1

'也当我输入值后滚动值互换。 '。你应该先解决这个'功能'。首先解决其他问题是没有意义的。 – greenapps

+0

'RecyclerView'实际上在视图不再可见时删除'Views',因此无法从不可见的行中检索edittext值。除非您在应用程序中缓存这些值。 –

+0

'view.findViewById(R.id.edtPrice);'。你发现你的NullPointerException来自这个声明?它的确如此。所以view == null。使用前检查。您无法从属于不再可见的视图的edittext中获取文本。 – greenapps

回答

0

您当前的实现将无法按预期工作。如果您在任何EditText中输入文本并且开始足够滚动,系统将回收滚动离屏的视图,并且您将开始看到之前滚动显示的重复文本。 修复:您应该创建一个ArrayList或字符串数​​组。在MyViewHolder中,您应该实现文本更改侦听器,并且每当EditText的文本发生更改时,都会使用getAdapterPosition()方法将该文本值添加到ArrayList中,以获取给定ViewHolder的逻辑位置。方法getAdapterPositio是ViewHolder类中的一个方法,所有子类都默认继承。使用该方法的值作为ArrayList /数组的索引,然后存储从文本更改侦听器检索到的文本值。在你的适配器的onBindViewHolder()方法内部,你应该使用position参数检查ArrayList /数组,以检查是否存在字符串,如果将其设置在EditText上,否则如果为null,则手动将该文本设置为空字符串。这将确保您在滚动期间看不到您的文本值被错误地回收。

+0

如果有五个视图可见,那么哪个视图的位置将由getAdapterPosition()传递?那个时候编辑的那个?无法想象。 – greenapps

+0

是的,这正是会发生的事情。但是您必须在每个MyViewHolder的EditText上分配文本更改侦听器。 –

+0

我不相信。假定getAdapterPosition()没有参数。 – greenapps