我正在尝试在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);
}
}
答案 0 :(得分:0)
最后,我解决了这个问题。我不知道为什么,但我改变了我在列表中的插入方式
旧代码:
public void addItem(ImageObject imageObject) {
itemList.add(imageObject);
notifyDataSetChanged();
}
新代码:
public void addItem(ImageObject imageObject) {
itemList.add(itemList.size() - 1, imageObject);
notifyDataSetChanged();
}