【问题标题】:Toast inside onclick recyclerviewonclick recyclerview里面的吐司
【发布时间】:2017-05-20 13:16:14
【问题描述】:

我正在制作一个应用程序,其中一个活动显示一个回收站视图。单击列表中的项目时,我正在尝试敬酒。我已经在 StackOverflow 上看到了各种解决方案,但它们没有帮助。

BasicsAdapter.java

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

    private List<Basic> basicsList;

    public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        public TextView title;

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

        @Override
        public void onClick(View v) {

        }
    }

    public BasicsAdapter(List<Basic> basicsList){
        this.basicsList = basicsList;
    }

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

        itemView.setClickable(true);
        itemView.setOnClickListener(true);
        //itemView.setFocusableInTouchMode(true); //dont enable this

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Basic basic = basicsList.get(position);
        holder.title.setText(basic.getTitle());
    }

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

basics_list.java

public class basics_list extends AppCompatActivity {
    private DrawerLayout mDrawerLayout;
    private List<Basic> basicList = new ArrayList<>();
    private RecyclerView recyclerView;
    private BasicsAdapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle(R.string.basics_list_name);
        setContentView(R.layout.activity_basics_list);

        // Adding Toolbar to Main screen

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        /*ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager); */

        // set recycler view

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        mAdapter = new BasicsAdapter(basicList);
        final RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(mAdapter);

        prepareBasicsData();

        // Create Navigation drawer and inflate layout
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);

// Adding menu icon to Toolbar
        ActionBar supportActionBar = getSupportActionBar();
        if (supportActionBar != null) {
            supportActionBar.setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp);
            supportActionBar.setDisplayHomeAsUpEnabled(true);
        }

// Set behavior of Navigation drawer
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    // This method will trigger on item Click of navigation menu
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        // Set item in checked state
                        menuItem.setChecked(true);
                        // TODO: handle navigation
                        // Closing drawer on item click
                        mDrawerLayout.closeDrawers();
                        return true;
                    }
                });


    }

    private void prepareBasicsData() {
        Basic basic = new Basic("Introduction to Linux");
        basicList.add(basic);

        basic = new Basic("What is The Terminal");
        basicList.add(basic);

        basic = new Basic("Programmers guide");
        basicList.add(basic);

        mAdapter.notifyDataSetChanged();
    }
}

【问题讨论】:

  • 您的 Toast 消息在您的代码中的什么位置?
  • 我删除了它。我试过的都没有。 getApplicationContext 或 getBaseContext 无效。将活动与“this”一起使用无效
  • 只需将Context 添加为类的构造函数之一,当您从 Activity 初始化类时,传递“this”即可获得上下文。
  • @AndroidNFC 是的,在我的answer中已经提到过。
  • @creativecreatorormaybenot 在这样的问题上,如果没有明确区分用户实际查询的内容,我会在 cmets 中回答可能性,以避免不属于实际问题的答案。可能会在未来几年误导读者。

标签: android android-studio android-recyclerview


【解决方案1】:

使用itemView.setOnClickListener(new View.OnClickListener() {}) 代替itemView.setOnClickListener(true)

这样您可以直接应用OnClickListener。它看起来类似于:

itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void OnClick(View view) {
        Toast.makeText(view.getContext(), "Item is clicked", Toast.LENGTH_SHORT).show();
    }
});

你可以把它放到构造函数中。

【讨论】:

  • 其实他有一个视图引用,并且可以从中获取上下文,那么他为什么需要一个活动呢?
  • 还有为什么你需要在 onCreateViewHolder() 中设置监听器,只需在视图持有者构造函数中执行此操作即可。
  • 对上述“LENGHT.SHORT”的小修改:改用“Toast.LENGTH_SHORT”。
【解决方案2】:

只需将您的OnClickListener 设置在您的ViewHolder 中即可。

公共类 BasicsAdapter 扩展 RecyclerView.Adapter {

private List<Basic> basicsList;

public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    public TextView title;

    public MyViewHolder(View view){
        super(view);
        view.setOnClickListener(new View.OnClickListener() {
            Toast.makeText(view.getContext(), "Item is clicked", LENGHT.SHORT).show();
        });
        title = (TextView)view.findViewById(R.id.title);
    }

}

public BasicsAdapter(List<Basic> basicsList){
    this.basicsList = basicsList;
}

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

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    Basic basic = basicsList.get(position);
    holder.title.setText(basic.getTitle());
}

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

【讨论】:

  • 对上述“LENGHT.SHORT”的小修改:改用“Toast.LENGTH_SHORT”。
【解决方案3】:

这可能会对您有所帮助:

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

private List<Basic> basicsList;

public static class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView title;
    Context context;

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

public BasicsAdapter(Context context,List<Basic> basicsList){
    this.context=context;
    this.basicsList = basicsList;
}

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

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    Basic basic = basicsList.get(position);
    holder.title.setText(basic.getTitle());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
       Toast.makeText(context,"Show your text here",Toast.LENGTH_SHORT).show();
       }
   });
}

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

【讨论】:

    【解决方案4】:

    希望对你有所帮助。 他使用了一个接口来监听 ViewHolder 中视图的点击。 https://www.youtube.com/watch?v=wCSePoE3lqA

    【讨论】:

      猜你喜欢
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 2020-07-26
      • 1970-01-01
      相关资源
      最近更新 更多