2017-10-20 8 views
0

recyclerview의 각 항목에있는 editext 필드 (carname과 가격)에서 click 저장시 모든 필드 값을 string의 목록으로 가져올 필요가있는 경우에도 스크롤 값을 교환 한 후에 값을 입력했습니다. 여기 내 코드가있다.recyclerview에서 edlerxt 값을 문자열 목록으로 가져 오는 방법

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. 사용하기 전에 확인하십시오. 더 이상 보이지 않는보기에 속하는 편집 문구에서 텍스트를 가져올 수 없습니다. – greenapps

답변

0

예상대로 현재 구현이 작동하지 않습니다. 어떤 EditText에 텍스트를 입력하고 충분히 스크롤을 시작하면 시스템은 오프 스크린으로 스크롤 된 뷰를 재활용하고 이전에 화면을 스크롤 한 것처럼 반복되는 텍스트 시작을 보게됩니다. 수정 : ArrayList 또는 문자열 배열을 만들어야합니다. MyViewHolder 내부에서 텍스트 변경 리스너를 구현하고 EditText 텍스트가 변경 될 때마다 getAdapterPosition() 메서드를 사용하여 지정된 ViewHolder의 논리 위치에 대한 ArrayList에 해당 텍스트 값을 추가합니다. getAdapterPositio 메소드는 ViewHolder 클래스의 메소드로, 모든 서브 클래스는 디폴트 상속을받습니다. 해당 메서드의 값을 ArrayList/배열에 대한 인덱스로 사용하고 텍스트 변경 리스너에서 검색 한 텍스트 값을 저장합니다. 어댑터의 onBindViewHolder() 메서드 내부에서 ArrayList/array를 position 인수로 검사하여 문자열이 있는지 확인하십시오. EditText에 설정되어있는 경우에는 그렇지 않으면 null을 수동으로 설정하여 빈 문자열로 설정해야합니다. 이렇게하면 스크롤하는 동안 텍스트 값이 잘못 재생되는 것을 볼 수 없습니다.

+0

5 개의 뷰가 표시되고있는 경우, getAdapterPosition()에 의해 어느 뷰의 위치가 전달 될까 그 순간에 편집되는 것? 그것을 상상할 수 없다. – greenapps

+0

네, 그렇게 될 것입니다. 그러나 모든 MyViewHolder의 EditText에 텍스트 변경 리스너를 할당해야합니다. –

+0

나는 그것을 믿지 않는다. getAdapterPosition()에 매개 변수가 없다고 가정합니다. – greenapps