我需要创建一个包含3列的RecyclerView,其中有一个按钮,当单击该按钮时,会在RecyclerView中添加一个自定义视图。当我点击一个视图时,它会被删除。例如:我添加了5个视图,如果我点击数字3,数字3将被销毁,数字4e5后退一步。我在GridLayout中创建了这个,但我希望它在RecyclerView中,我知道我需要一个适配器、一个Viewholder和一个LayoutManager。那么这是怎么做到的呢?
这就是GridLayout:的外观
public class MainActivity extends AppCompatActivity {
GridLayout gridLayout;
static int i;
static int n = 1000;
private Button theButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridLayout = (GridLayout)findViewById(R.id.gamehistory);
Button b = (Button)findViewById(R.id.Button01);
b.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
theButton = new Button(MainActivity.this);
TextView theText = new TextView(MainActivity.this);
theText.setGravity(Gravity.CENTER_HORIZONTAL);
final LinearLayout theLayout = new LinearLayout(MainActivity.this);
theLayout.setOrientation(LinearLayout.VERTICAL);
theLayout.setBackgroundColor(Color.parseColor("#8BAAC3"));
theLayout.setId(++i);
theButton.setId(++n);
theButton.setText(theButton.getId() + "");
theText.setText(theLayout.getId() + "");
theLayout.addView(theButton);
theLayout.addView(theText);
gridLayout.addView(theLayout);
GridLayout.LayoutParams lp = (GridLayout.LayoutParams) theLayout.getLayoutParams();
lp.setMargins(10, 10, 10, 10);
theButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
gridLayout.removeView(theLayout);
}
});
}
});
}
}
关于我使用RecyclerView的尝试,我在博客中尝试了一个指南,但没有成功。
通常,您应该发布您尝试使用RecyclerView的代码(而不是使用GridView的代码)。话虽如此,这里有一些例子可以让你朝着正确的方向前进。
样品活性
public class MainActivity extends AppCompatActivity {
private static final int NUMBER_COLUMNS = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new GridLayoutManager(this, NUMBER_COLUMNS));
recyclerView.addItemDecoration(new SampleItemDecoration());
final MyAdapter adapter = new MyAdapter();
recyclerView.setAdapter(adapter);
// Items can be added to adapter from any part of code
adapter.addItem("Static Item A");
adapter.addItem("Static Item B");
findViewById(R.id.button_add_item).setOnClickListener(new View.OnClickListener() {
int i;
@Override
public void onClick(View v) {
adapter.addItem("Dynamic Item " + i++);
}
});
}
}
样本适配器
class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> items = new ArrayList<>();
public void addItem(String name) {
items.add(name);
notifyItemInserted(items.size() - 1);
}
public void removeItem(int position) {
items.remove(position);
notifyItemRemoved(position);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.grid_item_button, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.setButtonName(items.get(position));
}
@Override
public int getItemCount() {
return items.size();
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private Button button;
public ViewHolder(View itemView) {
super(itemView);
button = (Button) itemView.findViewById(R.id.grid_button);
button.setOnClickListener(this);
}
public void setButtonName(String buttonName) {
button.setText(buttonName);
}
@Override
public void onClick(View v) {
removeItem(getAdapterPosition());
}
}
}
样品解码器
class SampleItemDecoration extends RecyclerView.ItemDecoration {
Paint paint = new Paint();
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
for (int i = 0; i < parent.getChildCount(); i++) {
View view = parent.getChildAt(i);
paint.setColor(Color.parseColor("#8BAAC3"));
if (parent.getChildLayoutPosition(view) == RecyclerView.NO_POSITION) {
continue;
}
// Compute bounds of cell in layout
Rect bounds = new Rect(
layoutManager.getDecoratedLeft(view),
layoutManager.getDecoratedTop(view),
layoutManager.getDecoratedRight(view),
layoutManager.getDecoratedBottom(view)
);
// Add space between cell backgrounds
bounds.inset(2, 2);
c.drawRect(bounds, paint);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.set(10, 10, 10, 10); // Specify spacing between items in grid
}
}