Android 如何删除变量上的值
我是Android新手,我有一个问题。 我有一个可点击的recyclerview,它将发送一个查询。单击时,它将获得所单击的每个位置的编号/ID 像这样:Android 如何删除变量上的值,android,android-recyclerview,recyclerview-layout,onitemclick,Android,Android Recyclerview,Recyclerview Layout,Onitemclick,我是Android新手,我有一个问题。 我有一个可点击的recyclerview,它将发送一个查询。单击时,它将获得所单击的每个位置的编号/ID 像这样: fno = arrivals.get(position).flightno; codeCity = arrivals.get(position).arr; 第一次单击会成功,但第二次或第三次单击会出错。我认为这是因为变量fno和codeCity已经被填充了。那么如何删除变量上的值呢 单击recyclerview时,这是我的代码: mRecy
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(“城市”);
String flightdate=args.getString(“flightdate”);
fno=args.getString(“flightno”);
到货日期。详细信息(codeIata、航班日期、fno);
}
公共静态无效详细信息(字符串s、字符串日期、字符串fno){
DateFormat df=新的简化格式(“yyyy-MM-d”);
date=df.format(Calendar.getInstance().getTime());
调用arrCall=mApiInterface.getArr(s,“2019-03-04”,fno);
arrCall.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应
(答复){
System.out.println(“状态代码”+response.code());
arrivals=response.body().getResult();
mAdapter=新到达的dapter(mContext,到达);
//mRecyclerView.setAdapter(mAdapter);
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.e(“改造Get”,t.toString());
}
});
}
有两种方法可以捕获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) {
}
}
第二种方法(更为传统的方法)
覆盖适配器的viewholder的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);
}
}
希望这对您有所帮助。您遇到了什么错误?您需要单击而不是单击,这样您就可以获得所单击元素的正确位置。请参考我的答案@BachVu,指向第fno=arrivals.get(position)行。flightno@Rajesh但是如果我把onClick放进Adapter我就不能发送查询我看不到任何查询,你说的是bundle值?谢谢!但什么是“回收者”呢?类?我已经实现了您的代码,但仍然得到相同的错误,仍然指向第fno=arrivals.get(position).flightno行“无效索引1,大小为1”,并且指向第fno=arrivals.get(position).flightno行
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();