首页 > 解决方案 > 如何在没有 ListView 的情况下在 ArrayList 中添加 OnitemClickListener

问题描述

我想在 android studio 中制作仪表板。我使用两个 xml 来制作仪表板 main_activity 和 list_item 活动。在编码会话中,我使用了模型类适配器和主类。

public class MainActivity extends AppCompatActivity {

ArrayList<DashModel> dashModelArrayList;
DashAdapter dashAdapter;
private RecyclerView recyclerView;

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

    dashModelArrayList = new ArrayList<>();
    String heads[] = {"Jobs", "My Profile", "Messages", "Applied Jobs", "Resume", "Settings"};

    String subs[] = {"12 new jobs found", "75% complete", "2 new messages", "3 applies jobs", "Edit resume", "Set preferences"};

    int images[] = {R.drawable.find_jobs, R.drawable.profile, R.drawable.messages, R.drawable.applied_jobs,
            R.drawable.resume, R.drawable.settings};

    for (int count = 0; count < heads.length; count++) {
        DashModel dashModel = new DashModel();
        dashModel.setHead(heads[count]);
        dashModel.setSub(subs[count]);
        dashModel.setImage(images[count]);
        dashModelArrayList.add(dashModel);
        //this should be retrieved in our adapter

    }
    recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(), 2));
    dashAdapter = new DashAdapter(dashModelArrayList);
    recyclerView.setHasFixedSize(true);
    recyclerView.setAdapter(dashAdapter);
}}

适配器类:

public class DashAdapter extends RecyclerView.Adapter<DashAdapter.ViewHolder> {

ArrayList<DashModel> dashModelArrayList;

public DashAdapter(ArrayList<DashModel> dashModelArrayList) {
    this.dashModelArrayList = dashModelArrayList;
}

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

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

    String ret_head = dashModelArrayList.get(position).getHead();
    holder.setheader(ret_head);

    String ret_sub = dashModelArrayList.get(position).getSub();
    holder.set_sub(ret_sub);

    int ret_image = dashModelArrayList.get(position).getImage();
    holder.set_image(ret_image);

}

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

public class ViewHolder extends RecyclerView.ViewHolder{

    TextView header,sub_header;
    ImageView images;
    View myView;

    public ViewHolder(View itemView) {
        super(itemView);
        myView = itemView;
    }

    public void setheader(String h)
    {
        header = myView.findViewById(R.id.header);
        header.setText(h);
    }

    public void set_sub(String s)
    {
        sub_header = myView.findViewById(R.id.sub_header);
        sub_header.setText(s);
    }
    public void set_image(int i)
    {
        images = myView.findViewById(R.id.dash_image);
        images.setImageResource(i);
    }


}}

如何在此处添加 onItemclickListener?

我期望并希望在图标中添加 OnItemclickListener,但我不能也不知道如何添加。

标签: javaandroidarraylistandroid-recyclerview

解决方案


onClickListener为 RecyclerView 创建一个,您必须创建一个实现RecyclerView.OnItemTouchListener

import android.support.v7.widget.*;
import android.view.*;
import android.content.*;

public class RecyclerViewTouchListener implements RecyclerView.OnItemTouchListener {

    private GestureDetector gestureDetector;
    private ClickListener clickListener;

    public RecyclerViewTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
        this.clickListener = clickListener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clickListener != null) {
                    clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

        View child = rv.findChildViewUnder(e.getX(), e.getY());
        if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
            clickListener.onClick(child, rv.getChildPosition(child));
        }
        return false;
    }

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

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }

    public interface ClickListener{

        public void onClick(View view,int position);
        public void onLongClick(View view,int position);
    }
}

之后,您可以将其附加到您的RecyclerView以收听点击。

recyclerView.addOnItemTouchListener(new RecyclerViewTouchListener(getActivity(), recyclerView, new RecyclerViewTouchListener.ClickListener(){

        @Override
        public void onClick(View view, int position)
        {
            // TODO: Implement this method


        }

        @Override
        public void onLongClick(View view, int position)
        {
            // TODO: Implement this method
        }                                           
    }));

推荐阅读