【问题标题】:How to delete value on variable如何删除变量的值
【发布时间】:2019-07-27 15:04:22
【问题描述】:

我是 Android 新手,我有一个问题。 我有一个可以点击的 recyclerview 并会发送一个查询。点击时,会得到每个被点击位置的编号/ID,

像这样:

fno = arrivals.get(position).flightno;
codeCity = arrivals.get(position).arr;

第一次点击成功,第二次或第三次点击就报错。我认为这是因为变量 fno 和 codeCity 已被填充。那么如何删除变量上的值呢?

这是我点击 recyclerview 时的代码:

mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            GestureDetector gestureDetector = new GestureDetector(mContext, new GestureDetector.SimpleOnGestureListener() {

                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);

                    fno = arrivals.get(position).flightno;
                    codeCity = arrivals.get(position).arr;

                    final Bundle i = new Bundle();
                    i.putString("city", codeCity.toString()); // Key1
                    i.putString("flightno", fno.toString()); // Key1
                    open2(i);
                }
                return false;
            }

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

            }

            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

            }
        });

这是查询

public void open2(Bundle args) {
        codeIata = args.getString("city");
        String flightdate = args.getString("flightdate");
        fno = args.getString("flightno");
        ArrivalActivity.detail(codeIata, flightdate, fno);
    }
    
public static void detail(String s, String date, String fno) {

        DateFormat df = new SimpleDateFormat("yyyy-MM-d");
        date = df.format(Calendar.getInstance().getTime());
        Call<GetArrivals> arrCall = mApiInterface.getArr(s, "2019-03-04", "", fno);
        arrCall.enqueue(new Callback<GetArrivals>() {
            @Override
            public void onResponse(Call<GetArrivals> call, Response<GetArrivals>
                    response) {
                System.out.println("status code "+response.code());

                arrivals = response.body().getResult();
                mAdapter = new ArrivalAdapter(mContext, arrivals);
                //mRecyclerView.setAdapter(mAdapter);
            }

            @Override
            public void onFailure(Call<GetArrivals> call, Throwable t) {
                Log.e("Retrofit Get", t.toString());
            }
        });
    }

谢谢!

【问题讨论】:

  • 你遇到了什么错误?
  • 您需要 onClick 而不是 onTouch,这样您就可以获得点击的元素的正确位置,请参考我的回答 stackoverflow.com/a/44963520/1506395
  • @BachVu 指向线 fno = Arrivals.get(position).flightno;
  • @Rajesh 但如果我将 onClick 放入适配器中,我将无法发送查询
  • 我看不到任何查询,您是在谈论捆绑值吗?

标签: android android-recyclerview recyclerview-layout onitemclick


【解决方案1】:

有两种方法可以捕获 recyclerview 项目的点击事件:

第一种方法

覆盖onClick 方法而不是onInterceptTouchEvent

我给你举个例子。

mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(this,
        recyclerView, new ClickListener() {
    @Override
    public void onClick(View view, final int position) {
        fno = arrivals.get(position).flightno;
        codeCity = arrivals.get(position).arr;
    }

}));

class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{

    private ClickListener clicklistener;
    private GestureDetector gestureDetector;

    public RecyclerTouchListener(Context context, final RecyclerView recycleView, 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=recycleView.findChildViewUnder(e.getX(),e.getY());
                if(child!=null && clicklistener!=null){
                    clicklistener.onLongClick(child,recycleView.getChildAdapterPosition(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.getChildAdapterPosition(child));
        }

        return false;
    }

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

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

第二种方法(一种更传统的方法)

覆盖适配器视图的 OnClickListener:

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

    LayoutInflater inflater;
    Context context;

    private MyAdapter.RecyclerViewClickListener mListener;

    public MyAdapter(Context context, RecyclerViewClickListener mListener) {
        this.context = context;
        this.mListener = mListener;
        inflater = LayoutInflater.from(this.context);

    }

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public MyViewHolder(View item, RecyclerViewClickListener listener) {
            super(item);
            mListener = listener;
            item.setOnClickListener(this);
        }


        @Override
        public void onClick(View view) {
            mListener.onClick(view, getAdapterPosition());
        }
    }

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

        return new MyViewHolder(itemView,mListener);
    }
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

    }


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

    @Override
    public int getItemViewType(int position) {
        return position;
    }


    @Override
    public long getItemId(int position) {
        return 0;
    }


    public interface RecyclerViewClickListener {
        void onClick(View view, int position);
    }
}

在您的片段/活动中:

myadapter = new MyAdapter(getContext(), new MyAdapter.RecyclerViewClickListener() {
            @Override
            public void onClick(View view, int position) {
                fno = arrivals.get(position).flightno;
                codeCity = arrivals.get(position).arr;
            }
        });
        recyclerView.setAdapter(MyAdapter);
        MyAdapter.notifyDataSetChanged();

希望对你有所帮助。

【讨论】:

  • 谢谢!但是什么是 RecyclerTouchListener?上课?
  • 我已经实现了你的代码,但仍然出现同样的错误,仍然指向 fno =arrivals.get(position).flightno 行
  • "无效索引 1,大小为 1" 并指向行 fno = Arrivals.get(position).flightno
猜你喜欢
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 2014-08-04
  • 2012-05-31
  • 1970-01-01
相关资源
最近更新 更多