Java Android:RecyclerView表现为GridLayout

Java Android:RecyclerView表现为GridLayout,java,android,android-recyclerview,Java,Android,Android Recyclerview,我需要创建一个包含3列的RecyclerView,其中有一个按钮,单击该按钮时,会将自定义视图添加到RecyclerView中。当我在视图中单击时,它会被删除。例如:我添加了5个视图,如果我单击数字3,数字3将被销毁,数字4 e 5将后退一步。我在GridLayout中创建了它,但我希望它在RecyclerView中,我知道我需要一个适配器、一个Viewholder和一个LayoutManager。那么这是如何做到的呢 这是GridLayout的外观: public class MainActi

我需要创建一个包含3列的RecyclerView,其中有一个按钮,单击该按钮时,会将自定义视图添加到RecyclerView中。当我在视图中单击时,它会被删除。例如:我添加了5个视图,如果我单击数字3,数字3将被销毁,数字4 e 5将后退一步。我在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
    }
}
类MyAdapter扩展了RecyclerView.Adapter{ 私有列表项=新的ArrayList(); 公共void附加项(字符串名称){ 项目。添加(名称); notifyItemInserted(items.size()-1); } 公共无效删除项(内部位置){ 项目。移除(位置); 已移除(位置)的项目; } @凌驾 public ViewHolder onCreateViewHolder(视图组父级,int-viewType){ LayoutInflater充气器=LayoutInflater.from(parent.getContext()); 视图=充气机。充气(R.layout.grid\u item\u按钮,父项,false); 返回新的ViewHolder(视图); } @凌驾 公共无效onBindViewHolder(ViewHolder,int位置){ holder.setButtonName(items.get(position)); } @凌驾 public int getItemCount(){ 返回items.size(); } 类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{ 私人按钮; 公共视图持有者(视图项视图){ 超级(项目视图); button=(button)itemView.findViewById(R.id.grid\u按钮); setOnClickListener(此); } 公共无效setButtonName(字符串buttonName){ button.setText(buttonName); } @凌驾 公共void onClick(视图v){ removeItem(getAdapterPosition()); } } } 样品装饰师

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
    }
}
class SampleItemDecoration扩展了RecyclerView.ItemDecoration{
油漆=新油漆();
@凌驾
公共void onDraw(画布c、RecyclerView父级、RecyclerView.State){
RecycleView.LayoutManager LayoutManager=parent.getLayoutManager();
对于(int i=0;i
向我们展示您迄今为止所做的尝试。关于我尝试使用RecyclerView的情况,我在博客中尝试了一个指南,但没有成功。我用我试过的代码把链接摆到了指南上!非常感谢,它工作得非常好!:b但是您没有发布您尝试的代码;)。很高兴我能提供帮助。有一个问题,为什么
adapter.addItem(“静态项A”)
添加了一个新按钮,而该字符串会进入按钮文本?为什么?因为RecyclerView显示RecyclerAdapter中的项目,并且您向RecyclerAdapter添加了一个项目。如果你是说怎么做?这有点超出了这个问题的范围。我的意思是为什么字符串会直接进入按钮的文本?