2017-05-14 1 views
1

내 안드로이드 프로젝트에 RecyclerView이 있습니다. 거기에 AutoCompleteTextView에서 검색 행을 추가하고 있습니다. 각 행은 TextView이고 하나는 EditText 필드입니다. 추가 할뿐만 아니라 행을 제거합니다. 각 행에 제거 버튼이 있습니다.RecyclerView 행의 EditText 값을 지우십시오.

모두 정상적으로 작동합니다. 문제가있어 제거시 EditText 값을 지울 수 없습니다. 예를 들어, 세 개의 행을 추가하고 두 번째 행을 제거하면 세 번째 행은 자체 EditText 값으로 두 번째 자리에 와야합니다. 그러나 문제는 제거 된 행의 값이 지워지지 않고 세 번째 행의 EditText 값이이 값으로 대체된다는 것입니다. 그런 다음 다른 행을 추가하면 (3 위) 자동으로 EditText 필드가 이전 세 번째 행의 EditText 값으로 채워집니다.

어떻게 EditText 값을 삭제할 수 있습니까 ???

이것은 내 어댑터 코드입니다. 모든

public class SelectItemAdapter extends RecyclerView.Adapter<SelectItemAdapter.ItemHolder> { 

    private List<String> itemsName, itemsQty, itemsPCode, itemPlant, _retData; 
    private OnItemClickListener onItemClickListener; 
    private LayoutInflater layoutInflater; 
    private String[] mDataset; 
    public ArrayList myItems = new ArrayList(); 
    private Context context; 
    private String[] arrayForSaveEditTextValue; 

    public SelectItemAdapter(Context context, String[] mDataset) { 
     layoutInflater = LayoutInflater.from(context); 
     itemsName = new ArrayList<String>(); 
     itemsQty = new ArrayList<String>(); 
     itemsPCode = new ArrayList<String>(); 
     itemPlant = new ArrayList<String>(); 
     _retData = new ArrayList<String>(); 
     this.arrayForSaveEditTextValue = mDataset; 
    } 

    @Override 
    public SelectItemAdapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = layoutInflater.inflate(R.layout.custom_row_selected_item, parent, false); 
     return new ItemHolder(itemView, this); 
    } 

    @Override 
    public void onBindViewHolder(final SelectItemAdapter.ItemHolder holder, final int position) { 
     holder.setItemName(itemsName.get(position)); 
     holder.setItemQty(itemsQty.get(position)); 
     holder.setItemPCode(itemsPCode.get(position)); 
     holder.setItemPlant(itemPlant.get(position)); 
     holder.numPicker.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {} 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {} 

      @Override 
      public void afterTextChanged(Editable arg0) { 
       _retData.set(position, arg0.toString()); 
       Log.d("arg0",arg0.toString()); 
      } 
     }); 
    } 

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

    public String retrieveData(int i) { 
     return _retData.get(i); 
    } 

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

    public Object getItemName(int position) { 
     return itemsName.get(position); 
    } 

    public Object getItemQty(int position) { 
     return itemsQty.get(position); 
    } 

    public Object getItemPCode(int position) { 
     return itemsPCode.get(position); 
    } 

    public Object getItemPlant(int position) { 
     return itemPlant.get(position); 
    } 


    public void setOnItemClickListener(OnItemClickListener listener) { 
     onItemClickListener = listener; 
    } 

    public OnItemClickListener getOnItemClickListener() { 
     return onItemClickListener; 
    } 


    public interface OnItemClickListener { 
     public void onItemClick(ItemHolder item, int position); 
    } 

    public void add(int location, String iName, String iQty, String iPCode, String iPlant) { 
     itemsName.add(location, iName); 
     itemsQty.add(location, iQty); 
     itemsPCode.add(location, iPCode); 
     itemPlant.add(location, iPlant); 
     _retData.add(location,"0"); 
     notifyItemInserted(location); 
     notifyDataSetChanged(); 
    } 

    public void remove(int location) { 
     if (location >= itemsName.size()) 
      return; 

     itemsName.remove(location); 
     itemsQty.remove(location); 
     itemsPCode.remove(location); 
     itemPlant.remove(location); 
     _retData.remove(location); 
     notifyItemRemoved(location); 
     notifyDataSetChanged(); 
    } 

    public static class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     private SelectItemAdapter parent; 
     TextView textItemName, txtPCode, txtAvailableQty, txtTempQty, txtPlant; 
     Button bRemove; 
     EditText numPicker; 

     public ItemHolder(View itemView, SelectItemAdapter parent) { 
      super(itemView); 
      this.parent = parent; 
      textItemName = (TextView) itemView.findViewById(R.id.txtProductName); 
      txtAvailableQty = (TextView) itemView.findViewById(R.id.txtAvailbleQty); 
      txtPCode = (TextView) itemView.findViewById(R.id.txtPCode); 
      txtPlant = (TextView) itemView.findViewById(R.id.txtPlant); 
      bRemove = (Button) itemView.findViewById(R.id.bRemove); 
      numPicker = (EditText) itemView.findViewById(R.id.numberPicker); 
      bRemove.setOnClickListener(this); 
     } 

     public void setItemName(CharSequence name) { 
      textItemName.setText(name); 
     } 

     public void setItemQty(CharSequence name) { 
      txtAvailableQty.setText(name); 
     } 

     public void setItemPCode(CharSequence name) { 
      txtPCode.setText(name); 
     } 

     public void setItemPlant(CharSequence name) { 
      txtPlant.setText(name); 
     } 

     public CharSequence getItemName() { 
      return textItemName.getText(); 
     } 

     @Override 
     public void onClick(View v) { 
      final OnItemClickListener listener = parent.getOnItemClickListener(); 
      if (listener != null) { 
       listener.onItemClick(this, getPosition()); 
      } 
     } 
    } 

    public class RetItem { 
     public String _itemNumPic; 
    } 
} 

하고 제거 방법 ...

@Override 
public void onItemClick(SelectItemAdapter.ItemHolder item, int position) { 
    Toast.makeText(this, 
      "Remove " + " : " + item.getItemName(), 
      Toast.LENGTH_SHORT).show(); 
    myRecyclerViewAdapter.remove(position); 
} 

답변

0

먼저 string arrays을 많이 사용하는 대신 Object의 목록을 사용! 다음 원하는 동작을 달성하기 위해, 메인 목록에서 항목을 제거하고 여기에 notifyDataSetChanged();

를 호출 할 필요는 것은 예입니다 : 여기

List<DayEntity> days = new ArrayList<>(); 

하루 항목의 목록입니다, 당신은이 설정 이 같은 어댑터에 목록 :

days.remove(x); 
adapter.notifyDataSetChanged(); 
:

MyDayAdapter adapter = new MyDayAdapter(context, days); 

그래서 위치에서 항목을 제거하기 위해 'x'를이 방법을 수행 할 수 있습니다

0

1가 하나의 목록에서 모든 getter 및 setter와 데이터 모델 클래스를 만들기 ... 재미 : 방법에

public class SelectItemAdapter extends RecyclerView.Adapter<SelectItemAdapter.ItemHolder> { 
    private final ArrayList<MyData> mDataList = new ArrayList<>(); 

2 제거

//Remove from the list on click 
    private void removeAt(int position) { 
     mUserList.remove(position); 
     notifyItemRemoved(position); 
     notifyItemRangeChanged(position, mDataList.size()); 
    } 

3- 이제 onClick() 메서드 내에서 removeAt 메서드를 호출 할 수 있으며 어댑터 위치 인 위치를 전달하면됩니다.

   removeAt(getAdapterPosition()); 
0

RecyclerViewEditText에 입력 된 값을 추적해야합니다. 제 생각에 값을 저장하기 위해 arrayForSaveEditTextValue이라는 배열을 사용했습니다.하지만이 배열은 사용하지 않습니다. 귀하의 코드도 조금 어색합니다. 따라서이 목록을 구현하는 다른 접근 방식을 제안하고자합니다.

목록 항목에 대한 개체를 만듭니다.

public class ListItem { 
    public String itemsName; 
    public String itemsQty; 
    public String itemsPCode; 
    public String itemPlant; 
    public String _retData; 
    public String editTextValue = ""; // Default EditText Value 
} 

그러면 어댑터는 다음과 같아야합니다.

public class SelectItemAdapter extends RecyclerView.Adapter<SelectItemAdapter.ItemHolder> { 

    private List<ListItem> listItems; 
    private OnItemClickListener onItemClickListener; 
    private LayoutInflater layoutInflater; 

    public SelectItemAdapter(Context context, List<ListItem> listItems) { 
     layoutInflater = LayoutInflater.from(context); 
     this.listItems = listItems; 
    } 

    @Override 
    public SelectItemAdapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = layoutInflater.inflate(R.layout.custom_row_selected_item, parent, false); 
     return new ItemHolder(itemView, this); 
    } 

    @Override 
    public void onBindViewHolder(final SelectItemAdapter.ItemHolder holder, final int position) { 

     final ListItem tempListItem = listItems.get(position); 
     holder.textItemName.setText(tempListItem.itemsName); 
     holder.txtAvailableQty.setText(tempListItem.itemsQty); 
     holder.txtPCode.setText(tempListItem.itemsPCode); 
     holder.txtPlant.setText(tempListItem.itemPlant); 

     holder.numPicker.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
      } 

      @Override 
      public void afterTextChanged(Editable arg0) { 

       // Calculate your _retData and set the TextView 
       tempListItem._retData = calculateRetData(position, arg0.toString()); 
       tempListItem.editTextValue = arg0.toString(); 

       // Replace the item with the value updated 
       listItems.add(position, tempListItem); 
       notifyDataSetChanged(); 
      } 
     }); 
    } 

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

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

    public void setOnItemClickListener(OnItemClickListener listener) { 
     onItemClickListener = listener; 
    } 

    public OnItemClickListener getOnItemClickListener() { 
     return onItemClickListener; 
    } 


    public interface OnItemClickListener { 
     public void onItemClick(ItemHolder item, int position); 
    } 

    public void add(ListItem listItem) { 
     listItems.add(listItem); 
     notifyDataSetChanged(); 
    } 

    public void remove(int location) { 
     if (location >= listItems.size()) 
      return; 

     listItems.remove(location); 
     notifyDataSetChanged(); 
    } 

    public static class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     private SelectItemAdapter parent; 
     TextView textItemName, txtPCode, txtAvailableQty, txtTempQty, txtPlant; 
     Button bRemove; 
     EditText numPicker; 

     public ItemHolder(View itemView, SelectItemAdapter parent) { 
      super(itemView); 
      this.parent = parent; 
      textItemName = (TextView) itemView.findViewById(R.id.txtProductName); 
      txtAvailableQty = (TextView) itemView.findViewById(R.id.txtAvailbleQty); 
      txtPCode = (TextView) itemView.findViewById(R.id.txtPCode); 
      txtPlant = (TextView) itemView.findViewById(R.id.txtPlant); 
      bRemove = (Button) itemView.findViewById(R.id.bRemove); 
      numPicker = (EditText) itemView.findViewById(R.id.numberPicker); 
      bRemove.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      final OnItemClickListener listener = parent.getOnItemClickListener(); 
      if (listener != null) { 
       listener.onItemClick(this, getPosition()); 
      } 
     } 
    } 
} 

아이디어는 해당 객체와 RecyclerView에서 항목을 추가 및 삭제의 경우에 EditText 값을 저장하는 것입니다, 당신은 그에 따라 항목의 목록을 업데이트 한 다음 notifyDataSetChanged()를 호출해야합니다.

코드를 테스트하지 않았지만 아이디어를 얻은 것으로 보입니다. 제가 도와 드릴 수있는 다른 것이 있으면 알려주세요.

+0

응답을위한 thatnk u, 나는 이것을 시도 할 것이다. ** 무엇이 ** calculateRetData ** Textwatcher 메서드에서 ??? –

+0

당신이 사용한'setRetData' 메소드를위한 자리 표시 자. 네가 뭔가 계산했을 거라 생각 했어. 필요하지 않으면 함수를 무시하십시오. –

관련 문제