首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于使用水平和垂直滚动实现RecyclerView,我有一个问题

关于使用水平和垂直滚动实现RecyclerView,我有一个问题
EN

Stack Overflow用户
提问于 2017-08-18 19:29:20
回答 3查看 108关注 0票数 1

我想实现RecyclerView的水平和垂直滚动和垂直项目上的一个按钮,所以当我点击按钮,该文本应改为保存保存。在我的应用程序中,当我点击按钮时,文本会改变,但当我自动向下滚动时,另一个按钮的文本也会改变。下面是我的代码。

In this screenshot I clicked on VerticalList3's button and text is changed successfully

When I scrolled down automatically VerticalList20 and VerticalList14's button text is changed

代码语言:javascript
复制
 public class MainActivity extends AppCompatActivity {
private RecyclerView vertical_recycler_view,horizontal_recycler_view;
private ArrayList<String> horizontalList,verticalList;
private HorizontalAdapter horizontalAdapter;
private  VerticalAdapter verticalAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    vertical_recycler_view= (RecyclerView) findViewById(R.id.vertical_recycler_view);
    horizontal_recycler_view= (RecyclerView) findViewById(R.id.horizontal_recycler_view);



    horizontalList=new ArrayList<>();
    horizontalList.add("horizontal 1");
    horizontalList.add("horizontal 2");
    horizontalList.add("horizontal 3");
    horizontalList.add("horizontal 4");
    horizontalList.add("horizontal 5");
    horizontalList.add("horizontal 6");
    horizontalList.add("horizontal 7");
    horizontalList.add("horizontal 8");
    horizontalList.add("horizontal 9");
    horizontalList.add("horizontal 10");
    horizontalList.add("horizontal 11");
    horizontalList.add("horizontal 12");
    horizontalList.add("horizontal 13");
    horizontalList.add("horizontal 14");
    horizontalList.add("horizontal 15");
    horizontalList.add("horizontal 16");
    horizontalList.add("horizontal 17");
    horizontalList.add("horizontal 18");
    horizontalList.add("horizontal 19");
    horizontalList.add("horizontal 20");


    verticalList=new ArrayList<>();
    verticalList.add("verticallist 1");
    verticalList.add("verticallist 2");
    verticalList.add("verticallist 3");
    verticalList.add("verticallist 4");
    verticalList.add("verticallist 5");
    verticalList.add("verticallist 6");
    verticalList.add("verticallist 7");
    verticalList.add("verticallist 8");
    verticalList.add("verticallist 9");
    verticalList.add("verticallist 10");
    verticalList.add("verticallist 11");
    verticalList.add("verticallist 12");
    verticalList.add("verticallist 13");
    verticalList.add("verticallist 14");
    verticalList.add("verticallist 15");
    verticalList.add("verticallist 16");
    verticalList.add("verticallist 17");
    verticalList.add("verticallist 18");
    verticalList.add("verticallist 19");
    verticalList.add("verticallist 20");

    horizontalAdapter=new HorizontalAdapter(horizontalList);
          verticalAdapter=new VerticalAdapter(verticalList);


    LinearLayoutManager verticalLayoutmanager
            = new LinearLayoutManager(MainActivity.this, 
LinearLayoutManager.VERTICAL, false);
    vertical_recycler_view.setLayoutManager(verticalLayoutmanager);
//        RecyclerView.LayoutManager mLayoutManager = new 
LinearLayoutManager(getApplicationContext());
//        vertical_recycler_view.setLayoutManager(mLayoutManager);
    LinearLayoutManager horizontalLayoutManagaer
            = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false);
    horizontal_recycler_view.setLayoutManager(horizontalLayoutManagaer);

    vertical_recycler_view.setAdapter(verticalAdapter);
    horizontal_recycler_view.setAdapter(horizontalAdapter);
}



public class HorizontalAdapter extends 
RecyclerView.Adapter<HorizontalAdapter.MyViewHolder> {

    private List<String> horizontalList;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView txtView;

        public MyViewHolder(View view) {
            super(view);
            txtView = (TextView) view.findViewById(R.id.txtView);
        }
    }


    public HorizontalAdapter(List<String> horizontalList) {
        this.horizontalList = horizontalList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.horizontal_item_view, parent, false);

        return new MyViewHolder(itemView);
    }

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

        holder.txtView.setText(horizontalList.get(position));
        holder.txtView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this,holder.txtView.getText().toString(),Toast.LENGTH_SHORT).show();
            }
        });
    }

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



public class VerticalAdapter extends RecyclerView.Adapter<VerticalAdapter.MyViewHolder> {

    private List<String> verticalList;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView txtView;
        public Button button;
        public MyViewHolder(View view) {
            super(view);
            txtView = (TextView) view.findViewById(R.id.txtView);
            button = (Button) view.findViewById(R.id.verticalButton);
        }
    }


    public VerticalAdapter(List<String> verticalList) {
        this.verticalList = verticalList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.vertical_item_view, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                holder.button.setText("Saved");
            }
        });
        holder.txtView.setText(verticalList.get(position));
        holder.txtView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Toast.makeText(MainActivity.this,holder.txtView.getText().toString(),Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return verticalList.size();
    }
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-18 20:10:22

@Potapov Anton是对的,但你也可以这样做。

实现此方法:

代码语言:javascript
复制
@Override
public int getItemViewType(int position) {
    return position;
}

希望能有所帮助

票数 1
EN

Stack Overflow用户

发布于 2017-08-18 19:34:24

RecyclerView将viewHolder重用于其他项目。因此,在viewHolder中直接将文本设置为按钮(如此holder.button.setText("Saved");)是错误的。您需要在此位置上的项目列表中设置文本。

票数 0
EN

Stack Overflow用户

发布于 2017-08-18 20:00:27

你也必须存储按钮的状态。您可以创建另一个列表:

代码语言:javascript
复制
List<Boolean> buttonsStatus = new ArrayList<>(numOfElements);

和填充列表:

代码语言:javascript
复制
for(int i = 0; i<numOfElements; i++)
{
     buttonsStatus.add(false)
}

或者,您可以修改当前列表以存储Item对象,如下所示:

代码语言:javascript
复制
public class Item{
     public String text
     public boolean saved;
     public Item(String text, boolean saved)
     {
          this.text = text;
          this.saved= saved;
     }
}

并在你的代码中使用它:

代码语言:javascript
复制
List<Item> verticalList = new ArrayList<>();
verticalList.add(new Item("verticallist 1", false));
...

onBindViewHolder方法中:

代码语言:javascript
复制
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.button.setText("Saved");
            verticalList.get(position).saved = true;
        }
    });
    Item item = verticalList.get(position);
    holder.button.setText(item.saved ? "Saved" : "Save");
    holder.txtView.setText(item.text);
    holder.txtView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(MainActivity.this,holder.txtView.getText().toString(),Toast.LENGTH_SHORT).show();
        }
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45755581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档