2015-11-05 49 views
-1

其实,当用户单击图像视图时,我一直试图在文本视图上显示用户名。点击图片视图时显示用户名,但当我向下滚动时,同名出现在列表中的不同位置。在列表中滚动的TextView重复

例如:

当我点击用户配置文件就说明它的名字:

enter image description here

但是,当我向下滚动,这个名字重复的其他用户。 enter image description here

这里是我的代码:

private List<Checkins> allPersons; 
    Checkins checkin; 

    public CustomAdapter(FragmentActivity activity, List<Checkins> classModel) 
    { 
     context = activity; 
     allPersons = classModel; 
     mActivity = activity; 
    } 


    @Override 
    public View getView(final int position, View convertView, ViewGroup parent){ 

    if (convertView == null) 
    { 
     layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = layoutInflater.inflate(R.layout.programlist, null); 
     holder = new mHolder(); 

     holder.txt_name = (TextView) convertView.findViewById(R.id.fragment_browse_grid_footer_product_name); 
     holder.txt_userName = (TextView) convertView.findViewById(R.id.txt_userName); 
     holder.imgV_profile = (ImageView) convertView.findViewById(R.id.imgVProfilePic); 
     holder.imgV_chceckins = (ImageView) convertView.findViewById(R.id.imageV_CheckinPlace); 
     holder.imgV_placePic = (ImageView) convertView.findViewById(R.id.checkinPlace_image); 

     convertView.setTag(holder); 
    } else{ 
      holder = (mHolder) convertView.getTag(); 
    } 

    checkin = allPersons.get(position); 
    holder.txt_name.setText(checkin.getPlaceName()); 
    holder.imgV_profile.setOnClickListener(new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) 
     { 

      Checkins checkin2 = allPersons.get(position); 
      holder.txt_userName.setVisibility(View.VISIBLE); 
      holder.txt_userName.setText(checkin2.getUserName()); 
     } 
    }); 

    return convertView; 
} 

class mHolder { 
    TextView txt_name; 
    TextView txt_userName; 
    ImageView imgV_profile; 
    ImageView imgV_chceckins; 
    ImageView imgV_placePic; 
    int pos; 
} 

UPDATE:如何只显示一个文本视图。 如图所示,我不想一次显示两个用户名(两个文本视图),如果我点击其他用户,一次只有一个用户名。

enter image description here

+0

而不是在'onClick'事件中再次执行'Checkins checkin2 = allPersons.get(position);',为什么不直接声明'checkin'为final并在'onClick'中使用?另外,为什么你必须在onClick中设置'setText()'?你不能只在getView本身设置文本? – Bhargav

回答

2

,只要您的适配器获得一个视图,您应该隐藏它。这是由ListView Recycling Mechanism引起的。

因此,请将以下行添加到您的getView方法中。

holder.txt_userName.setVisibility(View.GONE); 

注:为了更好的性能,你不会需要注册onClick听者每一个时代。注册一次就足够了。因此,将onClick注册码移动到if (convertView == null)块。


UPDATE#1

隐藏和重新表示TextView一个简单的解决方案。将以下if块添加到您的getView方法中。

Checkins thisPerson = allPersons.get(position); 
if(thisPerson.isUsernameDisplayed()){ 
    holder.txt_userName.setVisibility(View.VISIBLE); 
    holder.txt_userName.setText(thisPerson.getUserName()); 
} else { 
    holder.txt_userName.setVisibility(View.GONE); 
} 

你可能会问我什么isUsernameDisplayed是。答案是,您应该跟踪每个项目以查看其用户名是否可见。为此,你应该将他们的状态保存在某个地方。您可能希望将此信息保存在allPersons本身中。

+0

在哪里把这一行放在getView方法中,这不是我真正想要的。我想停止重复textview –

+0

@MustafaAdil它的地方其实并不重要。例如,在'return convertView;'之前。 –

+0

确定它现在正常工作,当我向下滚动但当我向上滚动该用户的文本视图消失了。 –

0

删除此checkin = allPersons.get(position);

使用allPersons列表类似下面

holder.txt_userName.setVisibility(View.VISIBLE); 
      holder.txt_userName.setText(allPersons.get(position).getUserName()); 
+0

不,它仍然在重复滚动。 –

0

使用列表来存储显示昵称的位置!按照列表设置TextView'Visibility

这是因为重用ViewHolder

private List<Checkins> allPersons; 
    private SparseArray<Integer> list = new SparseArray<>(); 
    Checkins checkin; 

    public CustomAdapter(FragmentActivity activity, List<Checkins> classModel) 
    { 
     context = activity; 
     allPersons = classModel; 
     mActivity = activity; 
    } 


    @Override 
    public View getView(final int position, View convertView, ViewGroup parent){ 

    if (convertView == null) 
    { 
     layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = layoutInflater.inflate(R.layout.programlist, null); 
     holder = new mHolder(); 

     holder.txt_name = (TextView) convertView.findViewById(R.id.fragment_browse_grid_footer_product_name); 
     holder.txt_userName = (TextView) convertView.findViewById(R.id.txt_userName); 
     holder.imgV_profile = (ImageView) convertView.findViewById(R.id.imgVProfilePic); 
     holder.imgV_chceckins = (ImageView) convertView.findViewById(R.id.imageV_CheckinPlace); 
     holder.imgV_placePic = (ImageView) convertView.findViewById(R.id.checkinPlace_image); 

     convertView.setTag(holder); 
    } else{ 
      holder = (mHolder) convertView.getTag(); 
    } 

    if(list.get(position)!=null &&list.get(position) == true){ 
     holder.txt_userName.setVisibility(View.VISIBLE); 
    }else{ 
     holder.txt_userName.setVisibility(View.GONE); 
    } 

    checkin = allPersons.get(position); 
    holder.txt_name.setText(checkin.getPlaceName()); 
    holder.imgV_profile.setOnClickListener(new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) 
     { 
      list.append(position,true); 
      Checkins checkin2 = allPersons.get(position); 
      holder.txt_userName.setVisibility(View.VISIBLE); 
      holder.txt_userName.setText(checkin2.getUserName()); 
     } 
    }); 

    return convertView; 
} 

class mHolder { 
    TextView txt_name; 
    TextView txt_userName; 
    ImageView imgV_profile; 
    ImageView imgV_chceckins; 
    ImageView imgV_placePic; 
    int pos; 
} 

,如果你只需要一个,你甚至不需要list.Just使用int来存放它。

+0

?我的意思是根据列表设置文本视图的可见性。 –

+0

我将稀疏数组的数据类型更改为布尔值,否则它在list.append(position,true)上显示错误。我也试过这段代码,但现在如果我点击其他用户,它将显示其用户名而不隐藏前一个用户名。 –