2015-11-05 40 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)上顯示錯誤。我也試過這段代碼,但現在如果我點擊其他用戶,它將顯示其用戶名而不隱藏前一個用戶名。 –