【问题标题】:How to add OnitemClickListener in ArrayList without ListView如何在没有 ListView 的情况下在 ArrayList 中添加 OnitemClickListener
【发布时间】:2019-11-24 23:16:41
【问题描述】:

我想在 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,但我不能也不知道如何添加。

【问题讨论】:

  • 能否请您发布您的 DashAdapter
  • 我更新了适配器类,请参阅

标签: java android arraylist android-recyclerview


【解决方案1】:

要为 RecyclerView 创建onClickListener,您必须创建一个实现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
        }                                           
    }));

【讨论】:

  • 是 String head[] = {"Jobs", "My Profile", "Messages", "Applied Jobs", "Resume", "Settings"} 的任何可能的解决方案;实际上我想在这个数组中添加 onitem 点击监听器
  • 您在 recyclerview 中显示了 head[] 数组,因此您可以使用我的答案为 recyclerView 创建一个 onClickListener。
猜你喜欢
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2019-03-01
  • 2017-03-27
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多