在适配器内部使用 RecyclerView
Using a RecyclerView inside of an adapter
这可能有点令人困惑,但请耐心等待并发表评论以进行澄清。我在适配器中使用 RecyclerView。这是因为我希望 ListView 中的多行可以水平滚动。行数完全没问题,但每行中的项目数是错误的。第一行显示正确的行数,但是当我只想要一个时,后面的行在每行中显示多个项目。第 1 行显示 1 个项目(这是我想要的),第 2 行显示 2 个项目,第 3 行显示 3 个项目等。这是我调用第一个适配器的片段文件:
public class featured_fragment extends android.support.v4.app.Fragment {
public ArrayList<featured_post> featured_post_list = new ArrayList<>();
private RecyclerView recyclerView;
public featured_fragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.featured_activity, container, false);
ListView listView = view.findViewById(R.id.featured_list);
featuredAdapter adapter = new featuredAdapter(getContext(),featured_post_list);
listView.setAdapter(adapter);
//Row 1
featured_post post = new featured_post();
adapter.add(post);
//Row 2
featured_post post1 = new featured_post();
adapter.add(post1);
//Row 3
featured_post post2 = new featured_post();
adapter.add(post2);
return view;
}
}
我的第一个调用回收器适配器的适配器:
public class featuredAdapter extends ArrayAdapter<featured_post>{
private List<featured_post> featured_postList = new ArrayList<>();
private RecyclerView recyclerView;
private recycler_adapter adapter;
private Context context;
public featuredAdapter(Context context, ArrayList<featured_post> users){
super(context,0,users);
this.context=context;
}
public View getView(int position, View convertView, ViewGroup parent) {
featured_post post_item = getItem(position);
if(convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.featured_fragment_activity, parent, false);
recyclerView = convertView.findViewById(R.id.featured_recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
adapter = new recycler_adapter(context,featured_postList);
recyclerView.setAdapter(adapter);
featured_post post = new featured_post(Integer.toString(position));
featured_postList.add(post);
}
return convertView
}
}
然后,最终的适配器命名为recycler_adapter
(请原谅这个适配器,我创建它的时候很困惑):
public class recycler_adapter extends RecyclerView.Adapter<recycler_adapter.MyViewHolder> {
private List<featured_post> featuredList;
private Context context;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView text;
public MyViewHolder(View view) {
super(view);
this.text = view.findViewById(R.id.my_text);
}
}
public recycler_adapter(Context context,List<featured_post> featuredList) {
this.featuredList = featuredList;
this.context = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(context).inflate(R.layout.recycler_activity,null);
MyViewHolder viewHolder = new MyViewHolder(itemView);
return viewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder,int position) {
featured_post featured_post = featuredList.get(position);
holder.text.setText(featured_post.string);
}
@Override
public int getItemCount() {
return featuredList.size();
}
如能提供有关添加多个项目的原因的任何帮助,我们将不胜感激。
编辑:
我通过清除 featuredAdapter
中 getView
方法开头的列表解决了这个问题。但是,我收到一条错误消息:
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 2(offset:2).state:4
知道为什么会突然发生这种情况吗?
我终于想出了解决问题的方法。首先,为了确保它不会多次放置相同的元素,我在 featuredAdapater 的 getView 方法中添加了一条语句来清除列表:
featured_postList.clear();
然后,我得到了一个 IndexOutOfBoundsException,因为 clear 语句在方法的开头。相反,我通过将语句放在 if(convertView == null)
语句中解决了这个问题。这解决了我的问题,现在它按预期工作了。
这可能有点令人困惑,但请耐心等待并发表评论以进行澄清。我在适配器中使用 RecyclerView。这是因为我希望 ListView 中的多行可以水平滚动。行数完全没问题,但每行中的项目数是错误的。第一行显示正确的行数,但是当我只想要一个时,后面的行在每行中显示多个项目。第 1 行显示 1 个项目(这是我想要的),第 2 行显示 2 个项目,第 3 行显示 3 个项目等。这是我调用第一个适配器的片段文件:
public class featured_fragment extends android.support.v4.app.Fragment {
public ArrayList<featured_post> featured_post_list = new ArrayList<>();
private RecyclerView recyclerView;
public featured_fragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.featured_activity, container, false);
ListView listView = view.findViewById(R.id.featured_list);
featuredAdapter adapter = new featuredAdapter(getContext(),featured_post_list);
listView.setAdapter(adapter);
//Row 1
featured_post post = new featured_post();
adapter.add(post);
//Row 2
featured_post post1 = new featured_post();
adapter.add(post1);
//Row 3
featured_post post2 = new featured_post();
adapter.add(post2);
return view;
}
}
我的第一个调用回收器适配器的适配器:
public class featuredAdapter extends ArrayAdapter<featured_post>{
private List<featured_post> featured_postList = new ArrayList<>();
private RecyclerView recyclerView;
private recycler_adapter adapter;
private Context context;
public featuredAdapter(Context context, ArrayList<featured_post> users){
super(context,0,users);
this.context=context;
}
public View getView(int position, View convertView, ViewGroup parent) {
featured_post post_item = getItem(position);
if(convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.featured_fragment_activity, parent, false);
recyclerView = convertView.findViewById(R.id.featured_recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
adapter = new recycler_adapter(context,featured_postList);
recyclerView.setAdapter(adapter);
featured_post post = new featured_post(Integer.toString(position));
featured_postList.add(post);
}
return convertView
}
}
然后,最终的适配器命名为recycler_adapter
(请原谅这个适配器,我创建它的时候很困惑):
public class recycler_adapter extends RecyclerView.Adapter<recycler_adapter.MyViewHolder> {
private List<featured_post> featuredList;
private Context context;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView text;
public MyViewHolder(View view) {
super(view);
this.text = view.findViewById(R.id.my_text);
}
}
public recycler_adapter(Context context,List<featured_post> featuredList) {
this.featuredList = featuredList;
this.context = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(context).inflate(R.layout.recycler_activity,null);
MyViewHolder viewHolder = new MyViewHolder(itemView);
return viewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder,int position) {
featured_post featured_post = featuredList.get(position);
holder.text.setText(featured_post.string);
}
@Override
public int getItemCount() {
return featuredList.size();
}
如能提供有关添加多个项目的原因的任何帮助,我们将不胜感激。
编辑:
我通过清除 featuredAdapter
中 getView
方法开头的列表解决了这个问题。但是,我收到一条错误消息:
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 2(offset:2).state:4
知道为什么会突然发生这种情况吗?
我终于想出了解决问题的方法。首先,为了确保它不会多次放置相同的元素,我在 featuredAdapater 的 getView 方法中添加了一条语句来清除列表:
featured_postList.clear();
然后,我得到了一个 IndexOutOfBoundsException,因为 clear 语句在方法的开头。相反,我通过将语句放在 if(convertView == null)
语句中解决了这个问题。这解决了我的问题,现在它按预期工作了。