2015-10-04 81 views
1

在这里,我正在从recyclerview的editText中添加和删除项目。添加工作正常,但是当我从数组列表中删除任何项目时,正确的项目被删除,但recyclerview总是删除最后一项。 下面是代码为什么recyclerView总是删除最后一个项目

public static class ViewHolder extends RecyclerView.ViewHolder { 
     EditText listItemEditText; 
     TextView addNew; 
     ImageView removeItem; 
     public ViewHolder(View view) { 
      super(view); 
      listItemEditText = (EditText)view.findViewById(R.id.list_item); 
      addNew = (TextView)view.findViewById(R.id.add); 
      removeItem = (ImageView)view.findViewById(R.id.deleteItem); 
     } 
    } 

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

    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     holder.listItemEditText.setId(position); 
     final TextWatcher textWatcher = new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 


       try{ 
        listItems.set(position,s.toString()); 
       }catch(Exception e){ 
        listItems.add(position,s.toString()); 
       } 
       if(s.length() >0 && !edited.get(position)){ 
        edited.set(position, true); 
        holder.addNew.setVisibility(View.VISIBLE); 
       }else if(s.length()==0){ 
        holder.addNew.setVisibility(View.GONE); 
       } 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       // TODO Auto-generated method stub 

      } 
     }; 
     holder.listItemEditText.addTextChangedListener(textWatcher); 
     holder.addNew.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       edited.add(position,true); 
       edited.add(position+1,false); 
       addEmptyRow(position+1); 
       v.setVisibility(View.GONE); 
      } 
     }); 
     holder.removeItem.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       deleteRow(position,holder); 
      } 
     }); 
    } 
    protected void addEmptyRow(int i) { 
     listItems.add(i,""); 
     notifyItemInserted(i); 
    } 

    @Override 
    public NoteListItemsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int arg1) { 
     View v = LayoutInflater.from(MainActivity.activity).inflate(R.layout.list_notes, parent,false); 
     ViewHolder holder = new ViewHolder(v); 
     return holder; 
    } 

    private void deleteRow(int position, ViewHolder holder){ 
     Toast.makeText(MainActivity.activity, "position="+position+", Size="+listItems.size(), Toast.LENGTH_SHORT).show(); 
     listItems.remove(position); 
     for(String ass:listItems){ 
      System.out.println(ass); 
     } 
     edited.remove(position); 
     notifyItemRemoved(position); 
     notifyDataSetChanged(); 

    } 
+0

尝试从活动/片段中提供的列表中删除。删除后做notifiyDataSetChanges。让我知道如果这工作。 –

+0

你的适配器在哪里?什么是listItems? – XxGoliathusxX

+0

我已经在使用它了。@ Ravi Gadipudi – Rookie

回答

2

这是错误的:

public void onBindViewHolder(final ViewHolder holder, final int position) 

应该是:

public void onBindViewHolder(final ViewHolder holder, int position) 

换句话说,你不能让position最终因为添加内容,位置将会改变,但RecyclerView不会因为它们的位置改变而重新绑定现有的项目(因此最终的位置将变得很重要)。

取而代之,使用viewHolder.getAdapterPosition()里面点击以获得最新的位置。

此外,通过在onBind中执行此操作,您正在创建不利于内存利用率(更多GC)的不必要的侦听器对象。

这样,而不是实现它:

@Override 
public NoteListItemsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int arg1) { 
    View v = LayoutInflater.from(MainActivity.activity).inflate(R.layout.list_notes, parent,false); 
    final ViewHolder holder = new ViewHolder(v); 
    holder.removeItem.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int pos = holder.getAdapterPosition(); 
      if (pos != RecyclerView.NO_POSITION) { 
       deleteRow(position,holder); 
      } 
     } 
    }); 
    // do the same for all listeners 
    return holder; 
} 

这将很好地工作,你会避免搅动对象。

+0

thnx @ yigit它的工作....什么是我应该做的onBindView? – Rookie

+0

只是更新视图,没有别的。 – yigit

相关问题