选择选项卡更改listView项目重复
When selected tab change listview items duplicating
我有一个四选项卡应用程序。一个选项卡有一个列表视图。当应用程序首先打开时,列表视图中的一切正常。但是当我更改选项卡时,列表视图项目会重复。我怎样才能找到解决这个问题的方法?
选项卡 3 onCreate 方法;
final List<k_lbir_c> items = new ArrayList<k_lbir_c>();
listAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
...
final ListView listView = (ListView) view.findViewById(R.id.listView);
adapter = new listAdapter(getActivity(),items);
listView.setAdapter(adapter);
...
}
适配器Class
class listAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<k_lbir_c> items;
public listAdapter(Activity activity,List<k_lbir_c> items){
mInflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.items = items;
}
@Override
public int getCount() {
return this.items.size();
}
@Override
public Object getItem(int position) {
return this.items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
mViewHolder mVHolder;
if(convertView==null)
{
convertView = mInflater.inflate(R.layout.k_lbir,null);
mVHolder = new mViewHolder();
convertView.setTag(mVHolder);
}
else
{
mVHolder = (mViewHolder)convertView.getTag();
}
mVHolder.texvV = (TextView)convertView.findViewById(R.id.textView);
mVHolder.imageV = (ImageView)convertView.findViewById(R.id.k_lbir_iv);
k_lbir_c item = items.get(position);
mVHolder.texvV = tvDetails(convertView,R.id.textView,item.getIsim());
mVHolder.imageV = ivDetails(convertView,R.id.k_lbir_iv,item.getImaj());
return convertView;
}
private TextView tvDetails(View v,int ResId,String Text){
TextView textView = (TextView)v.findViewById(ResId);
textView.setText(Text);
return textView;
}
private ImageView ivDetails(View v,int ResId,Drawable image){
ImageView imageView = (ImageView)v.findViewById(ResId);
imageView.setImageDrawable(image);
return imageView;
}
private static class mViewHolder{
TextView texvV;
ImageView imageV;
}
}
我想我必须用重写的片段生命周期方法清除列表视图。但我不知道我该怎么做。等待您的评论。
谢谢。
添加
items.clear();
在您的 onCreate() 方法中
试试这个
List<k_lbir_c> items=new ArrayList<>();
public listAdapter(Activity activity,List<k_lbir_c> items){
if(this.items.size>0)
{
this.items.clear;
}
mInflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.items = items;
}
不过,如果重复,请检查您的 Web 服务或数据库值,并检查您是否正确添加到列表中
已经写好的答案可以解决问题,但造成这种行为的主要原因似乎是您使用了 Singleton Fragments,这也是一个很好的方法。
所以问题是,当您在选项卡之间切换时,片段会从 ViewPager 中销毁,但片段对象本身仍然存在,当 return 返回它时,该对象将再次用于插入视图分页器和 onCreateView将再次调用,这里的解决方案(除了已经写的答案之外)是设置 ViewPager 可以处理而不会破坏它的片段数。默认情况下,ViewPager 只在当前显示的 Fragment 旁边保留一个 Fragment,超过该 Fragment 将被销毁,您可以使用 viewpager.setOffscreenPageLimit(int) 来设置 ViewPager 可以容纳而不会销毁的 Fragment 数量,onCreate 不会再次被调用。
我有一个四选项卡应用程序。一个选项卡有一个列表视图。当应用程序首先打开时,列表视图中的一切正常。但是当我更改选项卡时,列表视图项目会重复。我怎样才能找到解决这个问题的方法?
选项卡 3 onCreate 方法;
final List<k_lbir_c> items = new ArrayList<k_lbir_c>();
listAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
...
final ListView listView = (ListView) view.findViewById(R.id.listView);
adapter = new listAdapter(getActivity(),items);
listView.setAdapter(adapter);
...
}
适配器Class
class listAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<k_lbir_c> items;
public listAdapter(Activity activity,List<k_lbir_c> items){
mInflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.items = items;
}
@Override
public int getCount() {
return this.items.size();
}
@Override
public Object getItem(int position) {
return this.items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
mViewHolder mVHolder;
if(convertView==null)
{
convertView = mInflater.inflate(R.layout.k_lbir,null);
mVHolder = new mViewHolder();
convertView.setTag(mVHolder);
}
else
{
mVHolder = (mViewHolder)convertView.getTag();
}
mVHolder.texvV = (TextView)convertView.findViewById(R.id.textView);
mVHolder.imageV = (ImageView)convertView.findViewById(R.id.k_lbir_iv);
k_lbir_c item = items.get(position);
mVHolder.texvV = tvDetails(convertView,R.id.textView,item.getIsim());
mVHolder.imageV = ivDetails(convertView,R.id.k_lbir_iv,item.getImaj());
return convertView;
}
private TextView tvDetails(View v,int ResId,String Text){
TextView textView = (TextView)v.findViewById(ResId);
textView.setText(Text);
return textView;
}
private ImageView ivDetails(View v,int ResId,Drawable image){
ImageView imageView = (ImageView)v.findViewById(ResId);
imageView.setImageDrawable(image);
return imageView;
}
private static class mViewHolder{
TextView texvV;
ImageView imageV;
}
}
我想我必须用重写的片段生命周期方法清除列表视图。但我不知道我该怎么做。等待您的评论。
谢谢。
添加
items.clear();
在您的 onCreate() 方法中
试试这个
List<k_lbir_c> items=new ArrayList<>();
public listAdapter(Activity activity,List<k_lbir_c> items){
if(this.items.size>0)
{
this.items.clear;
}
mInflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.items = items;
}
不过,如果重复,请检查您的 Web 服务或数据库值,并检查您是否正确添加到列表中
已经写好的答案可以解决问题,但造成这种行为的主要原因似乎是您使用了 Singleton Fragments,这也是一个很好的方法。 所以问题是,当您在选项卡之间切换时,片段会从 ViewPager 中销毁,但片段对象本身仍然存在,当 return 返回它时,该对象将再次用于插入视图分页器和 onCreateView将再次调用,这里的解决方案(除了已经写的答案之外)是设置 ViewPager 可以处理而不会破坏它的片段数。默认情况下,ViewPager 只在当前显示的 Fragment 旁边保留一个 Fragment,超过该 Fragment 将被销毁,您可以使用 viewpager.setOffscreenPageLimit(int) 来设置 ViewPager 可以容纳而不会销毁的 Fragment 数量,onCreate 不会再次被调用。