【问题标题】:Position search ItemClick arraylist位置搜索 ItemClick 数组列表
【发布时间】:2021-05-19 19:23:28
【问题描述】:

晚上好, 我正在创建一个关于我国交通法规的应用程序,当单击任何单元格时,使用 RecyclerView 和 SearchView 的活动会给我带来一个包含所选单元格信息的新意图,但是当搜索某个单词时,当单击所需选项从位置 0 返回单元格信息,请按照我的代码寻求帮助,是否应不重置 onCLick 位置并进行新计数? 我该如何解决这个问题? 谢谢。

Item 185 after the research.

Information obtained from position 0 and not from 185.

EnquadramentoActivity.java

private RecyclerView recyclerViewEnquadramento;
private List<EnquadramentoModel> listaEnquadramentos = new ArrayList<>();
private List<EnquadramentoModel> listaEnquadramentosFiltrado = new ArrayList<>();


private AdapterEnquadramento adapter;
private DatabaseReference referencia;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    setContentView(R.layout.activity_enquadramento);

    referencia = FirebaseDatabase.getInstance().getReference();
    recyclerViewEnquadramento = findViewById(R.id.recyclerViewEnquadramento);
    
    this.criarEnquadramentos();
    
    adapter = new AdapterEnquadramento(listaEnquadramentos);
    
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerViewEnquadramento.setLayoutManager(layoutManager);
    recyclerViewEnquadramento.setHasFixedSize(true);
    recyclerViewEnquadramento.setAdapter(adapter);

    recyclerViewEnquadramento.addOnItemTouchListener(new RecyclerItemClickListener(getApplication() ,recyclerViewEnquadramento, new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            Intent intent = new Intent(getBaseContext(), DetalhesEnquadramentoActivity.class);
            intent.putExtra("tituloFirebase", listaEnquadramentos.get(position).getTituloFireBase());
            startActivity(intent);

        }
        @Override
        public void onLongItemClick(View view, int position) {
        }
    }));
}

private void criarEnquadramentos() {
    DatabaseReference dados = referencia.child("legislacao").child("Enquadramento");

    dados.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for (DataSnapshot valores: snapshot.getChildren()){
                EnquadramentoModel enquadramento = valores.getValue(EnquadramentoModel.class);
                listaEnquadramentos.add(enquadramento);

            }
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
}

private void filter(String text){
    List<EnquadramentoModel> filteredList = new ArrayList<>();
    for (EnquadramentoModel item : listaEnquadramentos){
        if (item.getTipificacao_resumida().toLowerCase().contains((text.toLowerCase()))){
            filteredList.add(item);
        }
    }
    adapter.filterList(filteredList);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    MenuItem item = menu.findItem((R.id.action_sarch));
    SearchView searchView = (SearchView) item.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {

            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            filter(newText);
            return false;
        }
    });
    return super.onCreateOptionsMenu(menu);
}

AdapterEnquadramento.java

private List<EnquadramentoModel> listaEnquadramentos = null;
private ArrayList<EnquadramentoModel> arrayList;
private String tituloFirebase;

public AdapterEnquadramento(List<EnquadramentoModel> listaEnquadramentos){
    this.listaEnquadramentos = listaEnquadramentos;
    this.arrayList = new ArrayList<EnquadramentoModel>();
    this.arrayList.addAll(listaEnquadramentos);
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemLista = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_enquadramento, parent, false);
    return new MyViewHolder(itemLista);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    EnquadramentoModel enquadramentoModel = listaEnquadramentos.get(position);
    holder.artigo.setText(enquadramentoModel.getArtigo());
    holder.tipificacao_resumida.setText(enquadramentoModel.getTipificacao_resumida());
    tituloFirebase = enquadramentoModel.getTituloFireBase();
}

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

public class MyViewHolder extends RecyclerView.ViewHolder{

    TextView artigo, tipificacao_resumida;

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        artigo = itemView.findViewById(R.id.textArtigo);
        tipificacao_resumida = itemView.findViewById(R.id.tipificacao_resumida);

    }
}

public void filterList(List<EnquadramentoModel> filteredList){
    listaEnquadramentos = filteredList;
    notifyDataSetChanged();
}

RecyclerItemClickListener

 private OnItemClickListener mListener;

public interface OnItemClickListener {
    public void onItemClick(View view, int position);

    public void onLongItemClick(View view, int position);
}

GestureDetector mGestureDetector;

public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = 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 && mListener != null) {
                mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
            }
        }
    });
}

@Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
        mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        return true;
    }
    return false;
}

@Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }

@Override
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}

【问题讨论】:

    标签: java android arraylist android-recyclerview searchview


    【解决方案1】:

    我认为你不需要使用 onItemTouchListener 来处理 recyclerview 项目点击事件。 在您的适配器中,您可以直接在适配器中处理点击,如下所示:

    private List<EnquadramentoModel> listaEnquadramentos = null;
    private ArrayList<EnquadramentoModel> arrayList;
    private String tituloFirebase;
    
    private OnItemClickListener listener;
    
    public AdapterEnquadramento(List<EnquadramentoModel> listaEnquadramentos){
        this.listaEnquadramentos = listaEnquadramentos;
        this.arrayList = new ArrayList<EnquadramentoModel>();
        this.arrayList.addAll(listaEnquadramentos);
    }
    
    // do not forget to set the listener in fragment/activity
    public void setListener(OnItemClickListener listener) {
        this.listener = listener;
    }
    
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemLista = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_enquadramento, parent, false);
        MyViewHolder viewHolder  = new MyViewHolder(itemLista);
    
        viewHolder.itemView.setOnClickListener(new View.OnClickListener{
            public void onClick(View view) {
                listener.onItemClick(view, viewHolder.getAdapterPosition());
            }
        });
        viHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            public void onLongClick(View view) {
                listener.onLongItemClick(view, viewHolder.getAdapterPosition());
            }
        })
    
        return viweHolder;
    }
    
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        EnquadramentoModel enquadramentoModel = listaEnquadramentos.get(position);
        holder.artigo.setText(enquadramentoModel.getArtigo());
        holder.tipificacao_resumida.setText(enquadramentoModel.getTipificacao_resumida());
        tituloFirebase = enquadramentoModel.getTituloFireBase();
    }
    
    @Override
    public int getItemCount() {
        return listaEnquadramentos.size();
    }
    
    public class MyViewHolder extends RecyclerView.ViewHolder{
    
        TextView artigo, tipificacao_resumida;
    
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            artigo = itemView.findViewById(R.id.textArtigo);
            tipificacao_resumida = itemView.findViewById(R.id.tipificacao_resumida);
    
        }
    }
    
    public void filterList(List<EnquadramentoModel> filteredList){
        listaEnquadramentos = filteredList;
        notifyDataSetChanged();
    }
    

    请注意,我不测试此代码,但上面的实现是基于您在问题中的原始代码。请相应调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-13
      • 2015-02-12
      • 2016-02-19
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多