如何在Recyclerview中实现onClicklistener以打开不同的活动

问题描述 投票:1回答:4

我正在使用Horizo​​ntal Recyclerview在我的应用中显示图标。它包含一个回收视图和一个Mainactivity类。

我正在尝试在适配器类中使用onClick侦听器方法,但令我惊讶的是它还没有正常工作,也无法识别意图并且无法解析意图符号。所以我用toast消息而不是app成功编译但没有任何反应。

这是我的回收视图类

public class SnapRecyclerAdapter extends RecyclerView.Adapter<SnapRecyclerAdapter.ReyclerViewHolder> {

    private LayoutInflater layoutInflater;
    private Context context;
    private ArrayList<Item> items;

    public SnapRecyclerAdapter(Context context, ArrayList<Item> items) {
        this.layoutInflater = LayoutInflater.from(context);
        this.context = context;
        this.items = items;
    }

    @Override
    public ReyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View item = layoutInflater.inflate(R.layout.item_recycler_view, parent, false);

        return new ReyclerViewHolder(item);
    }

    @Override
    public void onBindViewHolder(final ReyclerViewHolder holder, int position) {
        Item item = items.get(position);

        holder.image.setImageResource(item.getDrawable());
        holder.appName.setText(item.getName());
    }


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

    class ReyclerViewHolder extends RecyclerView.ViewHolder {
        private ImageView image;
        private TextView appName;

        private ReyclerViewHolder(final View v) {
            super(v);

            image = (ImageView) v.findViewById(R.id.image);
            appName = (TextView) v.findViewById(R.id.app_name);
            context = v.getContext();
        }


        private View.OnClickListener Click=new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                switch(getAdapterPosition())
                {
                    case 1:
                        Toast.makeText(context, "No data available", Toast.LENGTH_SHORT).show();
                }
            }

        };
    }

}

我的主动课是

public class MainActivity extends AppCompatActivity {

    private ArrayList<Item> items;
    private RecyclerView recyclerView;

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

        createApps();

        SnapHelper snapHelper = new GravitySnapHelper(Gravity.BOTTOM);
        snapHelper.attachToRecyclerView(recyclerView);

        // HORIZONTAL for Gravity START/END and VERTICAL for TOP/BOTTOM
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
        recyclerView.setHasFixedSize(true);

        SnapRecyclerAdapter adapter = new SnapRecyclerAdapter(this, items);
        recyclerView.setAdapter(adapter);
    }

    private void createApps() {
        items = new ArrayList<>();
        items.add(new Item("Google+", R.drawable.google_plus));
        items.add(new Item("Facebook", R.drawable.facebook));
        items.add(new Item("LinkedIn", R.drawable.linkedin));
        items.add(new Item("Youtube", R.drawable.youtube));
        items.add(new Item("Instagram", R.drawable.instagram));
        items.add(new Item("Skype", R.drawable.skype));
        items.add(new Item("Twitter", R.drawable.twitter));
        items.add(new Item("Wikipedia", R.drawable.wikipedia));
        items.add(new Item("Whats app", R.drawable.what_apps));
        items.add(new Item("Pokemon Go", R.drawable.pokemon_go));
    }
}
java android onclicklistener
4个回答
0
投票

你想要整个itemView上的点击监听器吗?这是一个例子:

//Implement View.OnClickListener
class ReyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private ImageView image;
    private TextView appName;

    private ReyclerViewHolder(final View v) {
        super(v);

        image = (ImageView) v.findViewById(R.id.image);
        appName = (TextView) v.findViewById(R.id.app_name);

        // Set the onClickListener
        v.setOnClickListener(this)
    }

    @Override
    public void onClick(View v) {

        // if (getAdapterPosition() != RecyclerView.NO_POSITION) {
              Context context = v.getContext();
              Intent intent = new Intent(context, aActivityClass.class);
              intent.putExtra(extraKey, extraValue);
              context.startActivity(intent)
        // }
    };
}

1
投票

您的实施setOnClickListener不正确。你应该为RecylerView和里面的每个视图设置它,你可以编写代码来开始一个活动或显示一个toast等。

public class SnapRecyclerAdapter extends RecyclerView.Adapter<SnapRecyclerAdapter.ReyclerViewHolder> {

    private LayoutInflater layoutInflater;
    private Context context;
    private ArrayList<Item> items;

    public SnapRecyclerAdapter(Context context, ArrayList<Item> items) {
        this.layoutInflater = LayoutInflater.from(context);
        this.context = context;
        this.items = items;
    }

    @Override
    public ReyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View item = layoutInflater.inflate(R.layout.item_recycler_view, parent, false);
        ReyclerViewHolder holder = new ReyclerViewHolder(item)
        item.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, items.get(holder.getAdapterPosition()).getName(), Toast.LENGTH_SHORT).show();
                // TODO: You can start an activity by using Intent as well.
            }
        });
        return holder;
    }

    @Override
    public void onBindViewHolder(final ReyclerViewHolder holder, int position) {
        Item item = items.get(position);

        holder.image.setImageResource(item.getDrawable());
        holder.appName.setText(item.getName());
    }


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

    class ReyclerViewHolder extends RecyclerView.ViewHolder {
        private ImageView image;
        private TextView appName;

        private ReyclerViewHolder(final View v) {
            super(v);

            image = (ImageView) v.findViewById(R.id.image);
            appName = (TextView) v.findViewById(R.id.app_name);
            context = v.getContext();
        }
    } 
}

0
投票

你在View上设置了点击监听器吗?像image.setOnClickListener(Click)这样的东西?顺便说一下,变量应该以小写字母开头


0
投票

你需要通过使用onclickListener和适配器中的make和接口从适配器传递视图

这是我们在适配器中传递视图的地方:

@Override
public void onBindViewHolder(myholder holder, final int position) {
    holder.parent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClick.click(position,view);
        }
    });

适配器onclick和活动的接口:

public void clickItem(PartnerBankAdapter.OnItemClick onItemClick){
this.onItemClick=onItemClick;
}
public interface OnItemClick{
public void click(int postion,View view);
}

将接口定义为适配器中的全局对象:

private OnItemClick onItemClick;

考虑适配器的这个示例:

public class PartnerBankAdapter extends RecyclerView.Adapter<PartnerBankAdapter.myholder> {

public Context mContext;
ArrayList<String> bankname;
ArrayList<Integer> iconlist;
private OnItemClick onItemClick;
public PartnerBankAdapter(Context mContext, ArrayList<String> banklist,ArrayList<Integer> iconlist)
{
    this.mContext = mContext;
    this.bankname=banklist;
    this.iconlist=iconlist;


}

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

@Override
public void onBindViewHolder(myholder holder, final int position) {
    holder.parent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClick.click(position,view);
        }
    });
   holder.txt.setText(bankname.get(position));
   holder.image.setImageResource(iconlist.get(position));
   holder.txtacc.setText(bankname.get(position));
}




@Override
public int getItemCount() {
    return bankname.size();
}
public  static  class myholder extends RecyclerView.ViewHolder {
    TextView txt,txtacc;
    ImageView image;
    LinearLayout parent;
    public myholder(View itemView) {
        super(itemView);
            txt= (TextView) itemView.findViewById(R.id.txbank);
            image=(ImageView) itemView.findViewById(R.id.imagebank);
            parent=(LinearLayout) itemView.findViewById(R.id.parent);
            txtacc=(TextView) itemView.findViewById(R.id.txbankacc);

    }
}
public void clickItem(PartnerBankAdapter.OnItemClick onItemClick){
    this.onItemClick=onItemClick;
}
public interface OnItemClick{
    public void click(int postion,View view);
}
}

然后在recyclerview上的活动中使用onclick

考虑下面的代码,用于onclick in activity:

partnerBankAdapter.clickItem(new PartnerBankAdapter.OnItemClick() {
        @Override
        public void click(int postion, View view) {
 }
});
© www.soinside.com 2019 - 2024. All rights reserved.