作爲法語開發者,我對我的英語表示歉意。Android - 使用ListView發行
所以,我的目標是爲我的android應用程序創建一個電話簿。該電話簿由ListView組成。我已經使用自定義適配器填充了我的ListView,允許用戶在每行中選擇一些TextView。 我相信一張圖片比千言萬語好,所以在這裏它是:
正如你可以看到紅色的部分是我選擇的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);
}
嗯,我不明白爲什麼要使用HashSet,如果我有一個ArrayList來完成這項工作! 使用convertView有什麼問題? – Manitoba 2012-03-27 12:22:25
當您滾動前一個視圖的轉換視圖時,會在此處呈現。這就是爲什麼如果在滾動前在convertview中選擇的位置被反映在這裏。 – user936414 2012-03-27 12:27:51
好的,那麼有什麼辦法不重用以前的視圖?喜歡用我定義的佈局創建一個新視圖? – Manitoba 2012-03-27 12:31:44