2012-03-27 51 views
1

作爲法語開發者,我對我的英語表示歉意。Android - 使用ListView發行

所以,我的目標是爲我的android應用程序創建一個電話簿。該電話簿由ListView組成。我已經使用自定義適配器填充了我的ListView,允許用戶在每行中選擇一些TextView。 我相信一張圖片比千言萬語好,所以在這裏它是:

enter image description here

正如你可以看到紅色的部分是我選擇的TextViews。 我不得不面對的問題如下:

當我從一行中選擇一個TextView時,下面4個位置的行的TextView也被選中了!這是一個常見問題還是由於我的代碼?

我在點擊監聽器上添加了一個日誌,對於每個TextView我點擊,我只收到一個日誌,所以我不認爲問題來自我的工作。

例如,如果你們中有些人不明白我說的話;我在第二行中選擇帶有drawableLeft圖片的TextView。 logcat返回以下條目: 「選擇:1」(在我的代碼中定義)。 如果我向下滾動我的ListView,我可以看到我的第二行(即我的TextView)按預期選中,但也是我的第6行,根本沒有預料到!

下面是我爲了使用顏色代碼或沒有行:

public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    selectedLocations.add(new Boolean(false)); 
    selectedAvailabilities.add(new Boolean(false)); 

    if (convertView == null) convertView = inflater.inflate(R.layout.phonebook_adapter_layout, parent, false); 

    final LinearLayout root = (LinearLayout) convertView.findViewById(R.id.phonebook_adapter_root); 
    final ImageView photo = (ImageView) convertView.findViewById(R.id.phonebook_adapter_image); 
    final TextView firstname = (TextView) convertView.findViewById(R.id.phonebook_adapter_firstname); 
    final TextView lastname = (TextView) convertView.findViewById(R.id.phonebook_adapter_lastname); 
    final TextView location = (TextView) convertView.findViewById(R.id.phonebook_adapter_location); 
    final TextView availability = (TextView) convertView.findViewById(R.id.phonebook_adapter_availability); 

    Bitmap mBitmap = null; 
    try 
    { 
     mBitmap = Media.getBitmap(context.getContentResolver(), Uri.parse(relations.get(position).getPhoto())); 
     photo.setImageBitmap(mBitmap); 
    } 
    catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    firstname.setText(relations.get(position).getFirstName()); 
    lastname.setText(relations.get(position).getLastName()); 

    DBStatus dbStatus = new DBStatus(KramerApplication.getInstance()); 
    Status status = dbStatus.getWithRelation(relations.get(position)); 
    dbStatus.close(); 

    if (status != null) 
    {   
     location.setText(status.getLocation()); 
     availability.setText(status.getAvailability()); 

     if (status.getDisplayedAvailability(2).equals("Busy")) 
      availability.setCompoundDrawablesWithIntrinsicBounds(R.drawable.availability_busy, 0, 0, 0); 
     else if (status.getDisplayedAvailability(2).equals("Occupied")) 
      availability.setCompoundDrawablesWithIntrinsicBounds(R.drawable.availability_busy, 0, 0, 0); 
     else if (status.getDisplayedAvailability(2).equals("Free")) 
      availability.setCompoundDrawablesWithIntrinsicBounds(R.drawable.availability_on, 0, 0, 0); 
     else 
      availability.setCompoundDrawablesWithIntrinsicBounds(R.drawable.availability_off, 0, 0, 0); 
    } 

    root.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) 
     { 
      Intent intent = new Intent(context, ContactDetailsActivity.class); 
      intent.putExtra("contact_id", relations.get(position).getId()); 
      context.startActivity(intent); 
     } 
    }); 

    location.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) 
     { 
      if (selectedLocations.get(position).booleanValue()) 
      { 
       selectedLocations.set(position, new Boolean(false)); 
       location.setBackgroundColor(Color.TRANSPARENT); 
      } 
      else 
      { 
       selectedLocations.set(position, new Boolean(true)); 
       location.setBackgroundColor(Color.RED); 
      } 
     } 
    }); 
    availability.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) 
     { 
      if (selectedAvailabilities.get(position).booleanValue()) 
      { 
       selectedAvailabilities.set(position, new Boolean(false)); 
       availability.setBackgroundColor(Color.TRANSPARENT); 
      } 
      else 
      { 
       selectedAvailabilities.set(position, new Boolean(true)); 
       availability.setBackgroundColor(Color.RED); 
      } 
     } 
    }); 

    return convertView; 
} 

的的ArrayList「selectedAvailabilities」和「selectedLocations」已正確初始化在構造函數中,做他們的工作時,我使用它們在另一項活動中(只讀)。

我希望你能幫助我。

問候。

################################# SOLUTION

如果有人找對於解決方案,在這裏。非常感謝user936414!!

更換(6號線):

if (convertView == null) convertView = inflater.inflate(R.layout.phonebook_adapter_layout, parent, false); 

通過:

convertView = inflater.inflate(R.layout.phonebook_adapter_layout, parent, false); 

前:

return convertView; 

地址:

if (selectedAvailabilities.get(position).booleanValue()) 
{ 
    availability.setBackgroundColor(Color.RED); 
} 
if (selectedLocations.get(position).booleanValue()) 
{ 
    location.setBackgroundColor(Color.RED); 
} 

回答

4

此行爲的原因是使用convertview。爲了解決這個問題,有一個HashSet並把所有在HashSet中選擇的位置。在getView中檢查包含Hashset和setSelected爲TextView。希望這可以幫助。

添加

if (selectedLocations.get(position).booleanValue()) 
{ 
      location.setBackgroundColor(Color.RED); 
} 
else 
{ 

      location.setBackgroundColor(Color.TRANSPARENT); 
} 

的onClickListener之外也保證convertView不會影響您的要求。

+0

嗯,我不明白爲什麼要使用HashSet,如果我有一個ArrayList來完成這項工作! 使用convertView有什麼問題? – Manitoba 2012-03-27 12:22:25

+0

當您滾動前一個視圖的轉換視圖時,會在此處呈現。這就是爲什麼如果在滾動前在convertview中選擇的位置被反映在這裏。 – user936414 2012-03-27 12:27:51

+0

好的,那麼有什麼辦法不重用以前的視圖?喜歡用我定義的佈局創建一個新視圖? – Manitoba 2012-03-27 12:31:44