【问题标题】:Wrong location listview错误的位置列表视图
【发布时间】:2017-06-19 17:42:10
【问题描述】:

所以我有显示 json 的回收站视图,并带有搜索该列表的选项。在单击特定列表项进行搜索之前,我会获得显示该项目详细信息的新活动。问题是当我搜索列表并单击项目时,我得到了错误的详细信息。例子 如果搜索结果在第一位(顶部列表视图项目),当我单击它时,我会从搜索之前的项目中获取数据。如何解决这个问题?

DataAdapter.java

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> implements Filterable {
    private ArrayList<AndroidVersion> mArrayList;
    private ArrayList<AndroidVersion> mFilteredList;
    Context ctx;
    private Context context;

    public DataAdapter(ArrayList<AndroidVersion> arrayList, Context ctx,Context context) {
        mArrayList = arrayList;
        mFilteredList = arrayList;
        this.ctx = ctx;
        this.context = context;
    }

    @Override
    public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false);
        return new ViewHolder(view,ctx,mFilteredList);
    }

    @Override
    public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, int i) {

        viewHolder.tv_name.setText(mFilteredList.get(i).getName());
        viewHolder.tv_version.setText(mFilteredList.get(i).getVer());
        viewHolder.tv_api_level.setText(mFilteredList.get(i).getApi());
    }

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

    @Override
    public Filter getFilter() {

        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {

                String charString = charSequence.toString();

                if (charString.isEmpty()) {

                    mFilteredList = mArrayList;
                } else {

                    ArrayList<AndroidVersion> filteredList = new ArrayList<>();

                    for (AndroidVersion androidVersion : mArrayList) {

                        if (charString.contains(",")) {
                            String searchChar[] = charString.split(",");
                            for (int i = 0; i < searchChar.length; i++) {

                                if (androidVersion.getApi().toLowerCase().contains(searchChar[i]) || androidVersion
                                        .getName()
                                        .toLowerCase().contains(searchChar[i]) || androidVersion.getVer().toLowerCase()
                                        .contains(searchChar[i])) {

                                    filteredList.add(androidVersion);
                                }
                            }
                        } else {
                            if (androidVersion.getApi().toLowerCase().contains(charString) || androidVersion.getName()
                                    .toLowerCase().contains(charString) || androidVersion.getVer().toLowerCase()
                                    .contains(charString)) {

                                filteredList.add(androidVersion);
                            }
                        }
                    }

                    mFilteredList = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = mFilteredList;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                mFilteredList = (ArrayList<AndroidVersion>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        private TextView tv_name,tv_version,tv_api_level;
        ArrayList<AndroidVersion> arrayList = new ArrayList<AndroidVersion>();
        Context ctx;
        public ViewHolder(View view, Context ctx, ArrayList<AndroidVersion> arrayList) {
            super(view);

            this.arrayList = arrayList;
            this.ctx = ctx;
            view.setOnClickListener(this);

            tv_name = (TextView)view.findViewById(R.id.tv_name);
            tv_version = (TextView)view.findViewById(R.id.tv_version);
            tv_api_level = (TextView)view.findViewById(R.id.tv_api_level);

        }

        @Override
        public void onClick(View v) {
            int i = getAdapterPosition();
            AndroidVersion arrayList = this.arrayList.get(i);
            Intent intent = new Intent(this.ctx, Details.class);
            intent.putExtra("name_id",arrayList.getName());
            intent.putExtra("version_id",arrayList.getVer());
            intent.putExtra("api_level_id",arrayList.getApi());
            ((Context) this.ctx).startActivity(intent);

        }
    }

}

【问题讨论】:

    标签: android json listview android-intent android-recyclerview


    【解决方案1】:

    我想问题是“ViewHolder”类仅在第一次初始化时,您将“ClickListener”设置为视图。但问题是您将完整的数组传递给“ViewHolder”一次,而没有将过滤后的数组传递给“ViewHolder”,因为它被初始化了一次。因此,当您获取点击位置的数据时,它会返回主数组列表中的数据,而不是过滤后的数据。

    所以来解决方案,将您的“ClickListener”设置为在“onBindViewHolder”方法中查看,而不是在 ViewHolder 类中查看,因为每次与列表交互或数据更改时都会调用它。希望它对你有用。

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2011-10-03
      • 2014-04-05
      相关资源
      最近更新 更多