2017-10-20 60 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