2017-09-13 43 views
0

我想對RecycleView添加一個項目這樣的添加項目:上RecycleView的Android

我有一個名爲圖片

public class Image{ 
    public String name; 
    public String url; 
} 

當我點擊按鈕添加一個新項的對象,我的代碼是這樣的:

@Override 
    public void addItemOnList(String url) { 
     adapter.addItem(new ImageObject("aaaaaa", R.drawable.close_button)); 
    } 

這是我的方法插入列表。

public void addItem(ImageObject imageObject) { 
     itemList.add(imageObject); 
     notifyDataSetChanged(); 
    } 

我的問題是,當我在點擊了第一次的AddItem我onBindViewHolder不遍歷所有的名單,但是當我在調試國防部檢查我getItemCount是正確的!所以如果我在第一次嘗試添加一個項目後一切正常。

MainActivity

public class MainActivity extends AppCompatActivity implements RecyclerViewClickListener, OnStartDragListener { 
    private RecyclerViewAdapter adapter; 
    private ArrayList<ImageObject> listViewItems; 
    private RecyclerView recyclerView; 
    private ItemTouchHelper itemTouchHelper; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

     recyclerView.setHasFixedSize(true); 

     StaggeredGridLayoutManager staggeredLayoutManager = new StaggeredGridLayoutManager(3, 1); 
     recyclerView.setLayoutManager(staggeredLayoutManager); 

     List<ImageObject> staggered = getListItemData(); 

     adapter = new RecyclerViewAdapter(this, staggered); 
     recyclerView.setAdapter(adapter); 

     ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter); 
     itemTouchHelper = new ItemTouchHelper(callback); 
     itemTouchHelper.attachToRecyclerView(recyclerView); 

    } 

    private List<ImageObject> getListItemData() { 

     listViewItems = new ArrayList<ImageObject>(); 
     listViewItems.add(new ImageObject("Alkane", R.drawable.one)); 
     listViewItems.add(new ImageObject("Ethane", R.drawable.two)); 
     listViewItems.add(new ImageObject("Alkyne", R.drawable.three)); 
     listViewItems.add(new ImageObject("Benzene", R.drawable.four)); 
     listViewItems.add(new ImageObject("Alkane", R.drawable.one)); 
     listViewItems.add(new ImageObject("Ethane", R.drawable.two)); 
     listViewItems.add(new ImageObject("Alkyne", R.drawable.three)); 
     listViewItems.add(new ImageObject("Benzene", R.drawable.four)); 
     listViewItems.add(new ImageObject("Alkane", R.drawable.one)); 
     listViewItems.add(new ImageObject("Ethane", R.drawable.two)); 
     listViewItems.add(new ImageObject("Alkyne", R.drawable.three)); 
     listViewItems.add(new ImageObject("Benzene", R.drawable.four)); 

     return listViewItems; 
    } 


    @Override 
    public void addButtonClicked() { 
     FragmentManager fm = getSupportFragmentManager(); 
     AlertFragment.newInstance(this).show(fm, "dialog"); 
    } 

    @Override 
    public void addItemOnList(String url) { 
     adapter.addItem(new ImageObject("aaaaaa", R.drawable.close_button)); 
    } 

    @Override 
    public void onStartDrag(RecyclerView.ViewHolder viewHolder) { 
     itemTouchHelper.startDrag(viewHolder); 
    } 
} 

我的適配器

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolders> implements ItemTouchHelperAdapter { 

    private List<ImageObject> itemList; 
    private MainActivity mainActivity; 
    private RecyclerViewClickListener recycleListener; 
    private OnStartDragListener dragStartListener; 

    public RecyclerViewAdapter(MainActivity mainActivity, List<ImageObject> itemList) { 
     this.itemList = itemList; 
     this.mainActivity = mainActivity; 
     this.recycleListener = mainActivity; 
     this.dragStartListener = mainActivity; 

    } 

    @Override 
    public ViewHolders onCreateViewHolder(ViewGroup parent, int viewType) { 

     View layoutView; 

     switch (viewType) { 
      case 1: 
       layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.add_item_list, null); 

       break; 
      default: 
       layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, null); 
       break; 
     } 

     return new ViewHolders(layoutView); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolders holder, final int position) { 

     switch (holder.getItemViewType()) { 
      case 1: 
       configureViewHolderAddItem(holder, position); 
       break; 

      case 0: 
       configureDefaultViewHolder(holder, position); 
       break; 
     } 


    } 

    private void configureViewHolderAddItem(final ViewHolders holder, final int position) { 
     holder.addItemLayout = holder.itemView.findViewById(R.id.add_item_layout); 
     holder.addItemLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       recycleListener.addButtonClicked(); 
      } 
     }); 
    } 

    private void configureDefaultViewHolder(final ViewHolders holder, final int position) { 
     Log.e("test", "position - " + position); 
     Log.e("test", "name - " + itemList.get(position).getName()); 
     holder.itemLayout = holder.itemView.findViewById(R.id.main_layout); 
     holder.removeItemButton = holder.itemView.findViewById(R.id.remove_item_button); 
     holder.itemLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       itemList.remove(holder.getLayoutPosition()); 
       notifyItemRemoved(holder.getLayoutPosition()); 
       notifyItemRangeChanged(holder.getLayoutPosition(), itemList.size()); 
      } 
     }); 
     holder.itemLayout.setBackgroundResource(itemList.get(position).getPhoto()); 
     holder.itemLayout.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        dragStartListener.onStartDrag(holder); 
       } 
       return false; 
      } 
     }); 
     //resizeTheFirstPosition(holder, position); 
    } 

    private void resizeTheFirstPosition(ViewHolders holder, int position) { 
     if (position == 0) { 
      int dimensionInDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
        200, mainActivity.getResources().getDisplayMetrics()); 
      holder.itemLayout.getLayoutParams().height = dimensionInDp; 
      holder.itemLayout.getLayoutParams().width = dimensionInDp; 
      holder.itemLayout.requestLayout(); 
     } 
    } 


    public void addItem(ImageObject imageObject) { 
     itemList.add(imageObject); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position == itemList.size() - 1 ? 1 : 0; 
    } 

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

    @Override 
    public boolean onItemMove(int fromPosition, int toPosition) { 
     Collections.swap(itemList, fromPosition, toPosition); 
     notifyItemMoved(fromPosition, toPosition); 
     return true; 
    } 

    @Override 
    public void onItemDismiss(int position) { 
     itemList.remove(position); 
     notifyItemRemoved(position); 
    } 


    public class ViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener, 
      ItemTouchHelperViewHolder { 

     private ImageView removeItemButton; 
     private ImageView addItemButton; 
     private FrameLayout addItemLayout; 
     private RelativeLayout itemLayout; 


     public ViewHolders(View itemView) { 
      super(itemView); 
     } 


     @Override 
     public void onClick(View view) { 
      itemList.remove(getLayoutPosition()); 
      //notifyItemRemoved(getLayoutPosition()); 
      notifyItemRangeChanged(getLayoutPosition(), itemList.size()); 
      Toast.makeText(mainActivity, "Removed item- " + getLayoutPosition(), Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onItemSelected() { 
      itemView.setBackgroundColor(Color.LTGRAY); 
     } 

     @Override 
     public void onItemClear() { 
      itemView.setBackgroundColor(0); 
     } 
    } 

回答

0

最後,我解決了這個問題。我不知道爲什麼,但我改變我的名單上如何插入

舊代碼:

public void addItem(ImageObject imageObject) { 
     itemList.add(imageObject); 
     notifyDataSetChanged(); 
} 

新代碼:

public void addItem(ImageObject imageObject) { 
    itemList.add(itemList.size() - 1, imageObject); 
    notifyDataSetChanged(); 
}