【问题标题】:Show only certain items in recycleview according to condition根据条件仅在recycleview中显示某些项目
【发布时间】:2020-04-29 17:16:24
【问题描述】:

我有一个 recycleview 显示从我的服务器上托管的 audios.json 文件中获取的音频文件列表。我有一个带有 getter 方法 getLanguage() 的模型类来查看音频语言。我想在回收视图中只显示用户偏好的音频文件。例如,如果用户只想要英语和俄语,我想只显示俄语和英语的列表。我们怎样才能做到这一点?现在整个列表都显示出来了。

public class AudioAdapter extends  RecyclerView.Adapter<AudioAdapter.HomeDataHolder> {

int currentPlayingPosition = -1;

Context context;
ItemClickListener itemClickListener;

List<Output> wikiList;

public AudioAdapter(List<Output> wikiList, Context context) {
    this.wikiList = wikiList;
    this.context = context;
}



@NonNull
@Override
public HomeDataHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(context).inflate(R.layout.audio_row_layout,viewGroup,false);
    HomeDataHolder mh = new HomeDataHolder(view);
    return mh;
}

@Override
public void onBindViewHolder(@NonNull final HomeDataHolder homeDataHolder, int i) {
    String desc = wikiList.get(i).getLanguage() + " • " + wikiList.get(i).getType();
    homeDataHolder.tvTitle.setText(wikiList.get(i).getTitle());
    homeDataHolder.tvotherinfo.setText(desc);
    homeDataHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (itemClickListener != null)
                itemClickListener.onClick(view,homeDataHolder.getAdapterPosition());
        }
    });


    homeDataHolder.rippleLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (itemClickListener != null)
                itemClickListener.onClick(view,homeDataHolder.getAdapterPosition());
        }
    });



}

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

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

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

public void setClickListener(ItemClickListener itemClickListener) {    //  Method for setting clicklistner interface
    this.itemClickListener = itemClickListener;

}

public class HomeDataHolder extends RecyclerView.ViewHolder {

    TextView tvTitle,tvotherinfo;
    MaterialRippleLayout rippleLayout;

    public HomeDataHolder(View v) {
        super(v);
        this.tvTitle = v.findViewById(R.id.title);
        this.tvotherinfo = v.findViewById(R.id.audioDesc);
        this.rippleLayout = v.findViewById(R.id.ripple);
    }

  }

}

【问题讨论】:

  • 在设置为 recyclerview 之前根据用户偏好过滤列表
  • 列出 响应。这是我传递给适配器的列表响应。我如何过滤它并创建一个新列表。

标签: android android-recyclerview android-adapter android-json


【解决方案1】:

不要直接传递wikiList,而是过滤然后发送:

假设您填写了wikiList,在将其传递给适配器之前,像这样过滤它:

在您初始化adapter 的活动中:

public class YourActivity extends ............{


........
........

//your filled list
private List<Output> wikiList;

//filtered list
private List<Output> filteredList= new ArrayList<Output>();

//filters
private List<String> filters = new ArrayList<String>();


//lets say the user chooses the languages "english" and "russian" after a button click or anything (you can add as many as you want)

filters.add("english");
filters.add("russian");


//now filter the original list

for(int i = 0 ; i<wikiList.size() ; i++){

Output item = wikiList.get(i);

if(filters.contains(item.getLanguage())){

filteredList.add(item);

}


}

//now create your adapter and pass the filteredList instead of the wikiList


AudioAdapter adapter = new AudioAdapter(filteredList , this);


//set the adapter to your recyclerview........
......
.....
......


}

我使用上面的"english""russian" 表示语言。我不知道它们在您的回复中是如何设置的,也许您使用"en" 代替"english" 所以要小心。

【讨论】:

  • 这很完美。我的清单会从项目增加到数千。用户是否必须等到所有 1000 个对象加载?
  • 我的解决方案是在传递给适配器之前过滤列表,所以如果你已经通过了 1000 个对象过滤应该减少它们。但我建议稍后在适配器中进行一些分页,但对于过滤它应该没问题。
  • 每种语言都有大约 1000 个音频文件。我如何加载它 - 每 20 个文件 - 然后像 facebook 一样再次加载。我的后端是一个包含所有音频文件 url 的 json 文件,每个文件都有一个从 1 到 1000 的 id 号。所以我想先加载 id 1 到 20,然后再滚动其余文件。这可以通过大量编辑来实现吗?
【解决方案2】:

对此的总体思路应该是:

  1. 您有一个包含所有项目的列表
  2. 您有用户选择的过滤规则
  3. 您从编号 1 中筛选项目,以查看哪些符合约束条件并将其存储在另一个列表中。

那么回收站视图只显示列表中编号 3 的项目。

这意味着回收器视图的getItemCount 将返回过滤列表的大小,而不是整个列表。

【讨论】:

  • List response Application.getInstance().setSingletonResponse(response);音频适配器 = 新音频适配器(响应,getActivity()); recyclerViewAudios.setAdapter(audioAdapter); audioAdapter.setClickListener(this);
  • 如何根据用户首选语言过滤此列表?
猜你喜欢
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2014-04-27
  • 2023-01-10
  • 2021-12-21
相关资源
最近更新 更多