在RecycleView Android上添加项目

时间:2017-09-13 19:10:02

标签: java android

我正在尝试在RecycleView上添加一个项目,如下所示:

我有一个名为Image

的对象
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);
        }
    }

1 个答案:

答案 0 :(得分:0)

最后,我解决了这个问题。我不知道为什么,但我改变了我在列表中的插入方式

旧代码:

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

新代码:

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