【问题标题】:Android - Open new activity on item clicked in RecyclerView [duplicate]Android - 在 RecyclerView 中单击的项目上打开新活动 [重复]
【发布时间】:2018-02-04 22:13:37
【问题描述】:

我正在为新手创建一个简单的应用程序,但我被困在主要部分。我创建了 RecyclerView 列表。我想知道如何通过单击 ListView 中的第一项来打开一个新的 Activity(参见屏幕截图)。

这是我的 MainActivity 文件:

public class MainActivity extends AppCompatActivity {

    Toolbar toolbar;
    DrawerLayout drawerLayout;
    NavigationView navigationView;

    private ArrayList<String> countries;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(layoutManager);
        countries = new ArrayList<>();
        countries.add("Computer");
        countries.add("RAM");
        countries.add("ROM");
        countries.add("MotherBoard");
        countries.add("Printer");
        countries.add("CPU");
        countries.add("Pendrive");
        countries.add("Keyboard & Mouse");
        RecyclerView.Adapter adapter = new DataAdapter(countries);
        recyclerView.setAdapter(adapter);

        recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            GestureDetector gestureDetector = new GestureDetector(getApplicationContext(),
                new GestureDetector.SimpleOnGestureListener() {
                    @Override
                    public boolean onSingleTapUp(MotionEvent e) {
                        return true;
                    }
                });

            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                View child = rv.findChildViewUnder(e.getX(), e.getY());
                if (child != null && gestureDetector.onTouchEvent(e)) {
                    int position = rv.getChildAdapterPosition(child);
                    Toast.makeText(getApplicationContext(), countries.get(position),
                        Toast.LENGTH_SHORT).show();
                }
                return false;
            }

            @Override
            public void onTouchEvent(RecyclerView rv, MotionEvent e) {
            }

            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
            }
        });
    }
}

数据适配器:

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
    private ArrayList<String> countries;

    public DataAdapter(ArrayList<String> countries) {
        this.countries = countries;
    }

    @Override
    public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, int i) {
        viewHolder.tv_country.setText(countries.get(i));
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{
        private TextView tv_country;
        public ViewHolder(View view) {
            super(view);
            tv_country = (TextView)view.findViewById(R.id.tv_country);
        }
    }
}

【问题讨论】:

标签: android android-recyclerview


【解决方案1】:

你应该使用 onItemClickListener 或 OnClickListener

 recyclerView.setOnClickListener(new View.OnClickListener() {
 ...
 }

【讨论】:

  • 你能详细告诉我吗?
  • 而不是使用这个recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() 你应该使用我在答案中说的方法。另一种可能性是向适配器添加一个 onclick 方法,用于当用户单击每个文本视图时
  • 谢谢老哥问题解决了
【解决方案2】:

在 onBindViewHolder 函数中,在项目上添加 onClickListner。

@Override
public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, int i) {

    viewHolder.tv_country.setText(countries.get(i));
    viewHolder.tv_country.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });

}

在这个例子中,我在 tv_country 上添加了 onCLickListner。如果您需要进一步的帮助,请在 cmets 中问我。

【讨论】:

  • 永远欢迎!
猜你喜欢
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 2020-11-14
  • 1970-01-01
相关资源
最近更新 更多