【发布时间】:2018-12-24 21:33:06
【问题描述】:
我有一个 recyclerView 并使用 editText 在 recyclerview 中搜索项目。我已经单击侦听器以获取单击项目时的位置。当一个项目被点击而不搜索时,它工作得很好。但是,每当我从编辑文本中搜索并单击某个项目时,它都会给我不正确的项目位置。
另一个问题是,一旦从 recyclerview 中单击项目,我就有关闭片段的功能,但不知何故,该功能也不起作用。 :(
recyclerView 代码
editText = rootView.findViewById(R.id.team_select_search);
recyclerView = rootView.findViewById(R.id.team_select_recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this.getContext()));
list_items = new ArrayList<>();
teamSelectAdapter = new TeamSelectAdapter(list_items, getContext());
recyclerView.setAdapter(teamSelectAdapter);
loadRecyclerViewData();
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
filter(s.toString());
}
});
teamSelectAdapter.setOnItemClickListener(new TeamSelectAdapter.ClickListener() {
@Override
public void onItemClick(int position, View v) {
TeamSelectModelClass clickeditem = list_items.get(position);
String team_id = clickeditem.getTeam_id();
String team_name = clickeditem.getTeam_name();
String team_logo_url = clickeditem.getTeam_logo_url();
Toast.makeText(getContext(),team_name,Toast.LENGTH_SHORT).show();
close_frag();
}
});
return rootView;
}
private void close_frag(){
getChildFragmentManager().beginTransaction().detach(this).commit();
}
private void filter(String text){
ArrayList<TeamSelectModelClass> filteredList = new ArrayList<>();
for (TeamSelectModelClass item : list_items){
if(item.getTeam_name().toLowerCase().contains(text.toLowerCase())){
filteredList.add(item);
}
}
teamSelectAdapter.filterList(filteredList);
}
recyclerview 适配器代码:
public class TeamSelectAdapter extends RecyclerView.Adapter<TeamSelectAdapter.ViewHolder> {
private List<TeamSelectModelClass> list_items;
private Context context;
private static ClickListener clickListener;
public interface ClickListener {
void onItemClick(int position, View v);
}
public void setOnItemClickListener(ClickListener clickListener) {
TeamSelectAdapter.clickListener = clickListener;
}
public void filterList(ArrayList<TeamSelectModelClass> filteredList){
list_items = filteredList;
notifyDataSetChanged();
}
public TeamSelectAdapter(List<TeamSelectModelClass> list_items, Context context) {
this.context=context;
this.list_items=list_items;
}
@NonNull
@Override
public TeamSelectAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
final View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.team_select_card_layout,viewGroup,false);
final ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull TeamSelectAdapter.ViewHolder viewHolder, int i) {
TeamSelectModelClass teamSelectModelClass = list_items.get(i);
viewHolder.textView_team_id.setText(teamSelectModelClass.getTeam_id());
viewHolder.textView_team_name.setText(teamSelectModelClass.getTeam_name());
if(teamSelectModelClass.getTeam_logo_url()!=null){
Picasso.get().load(teamSelectModelClass.getTeam_logo_url()).into(viewHolder.imageView_team_logo);
}else {
Picasso.get().load(R.drawable.psa_logo).into(viewHolder.imageView_team_logo);
}
}
public void clear(){
list_items.clear();
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return list_items.size();
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
RelativeLayout relativeLayout_team_select_card_layout;
TextView textView_team_id;
TextView textView_team_name;
ImageView imageView_team_logo;
public ViewHolder(@NonNull View itemView) {
super(itemView);
itemView.setOnClickListener(this);
relativeLayout_team_select_card_layout = itemView.findViewById(R.id.team_select_card_layout);
textView_team_id = itemView.findViewById(R.id.team_select_team_id);
textView_team_name = itemView.findViewById(R.id.team_select_team_name);
imageView_team_logo = itemView.findViewById(R.id.team_select_team_logo);
}
@Override
public void onClick(View v) {
clickListener.onItemClick(getLayoutPosition(), v);
}
}
}
【问题讨论】:
-
您可以尝试在 ViewHolder 类中使用 getAdapterPosition() 而不是 getLayoutPosition() 吗?您要覆盖哪个 onClick 方法
-
@MuratGuc 没有变化。它仍然给出了不正确的位置。 :(
-
我不知道您为什么要发送位置,但我认为只需发送您的 itemId,如
clickListener.onItemClick(list_items.get(getAdapterPosition).getTeamId(), v);并尝试根据 ID 进行处理。不是立场。因为您正在根据旧列表敬酒活动中的项目
标签: android android-recyclerview