我正在创建一个包含带有联系人的ListView的应用程序。列表元素最初仅以其中的联系人名称开头。在" choice_inflater"中有一个隐藏的ImageView。包含一个黄色的星形,当它被保存为收藏夹时,将显示在名称的左侧(按住)。用户可以按住ListView项目将其保存为收藏夹,此时应将星形设置为对于他们按下的项目可见。
我遇到的问题是每当我按下第一个项目并且我不知道为什么时,每六个项目出现的明星。谁能在这里找出我的问题?
这是我的自定义ListViewAdapter:
public class ListViewAdapter extends BaseAdapter {
private ArrayList<String> allContacts;
private Context context;
private LayoutInflater inflater;
public ListViewAdapter(Context context, ArrayList<String> allContacts) {
inflater = LayoutInflater.from(context);
this.context = context;
this.allContacts = allContacts;
}
@Override
public int getCount() {
return allContacts.size();
}
@Override
public Object getItem(int position) {
return allContacts.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ContactHolder holder;
View view = convertView;
if (view == null) {
view = inflater.inflate(R.layout.choice_inflater, parent, false);
holder = new ContactHolder();
assert view != null;
holder.tvContactName = (TextView) view.findViewById(R.id.tvContactListName);
holder.img = (ImageView)view.findViewById(R.id.imageView);
holder.tag = getItemId(position);
view.setTag(holder);
} else {
holder = (ContactHolder) view.getTag();
}
holder.tvContactName.setText(allContacts.get(position));
if(holder.hasStar == 1){
holder.img.setVisibility(View.VISIBLE);
}
else{
holder.img.setVisibility(View.GONE);
}
return view;
}
}
class ContactHolder {
TextView tvContactName;
long hasStar = 0;
ImageView img;
}
这是我更新ListView的地方。用户按下列表视图项目,我希望他们按下的项目旁边显示一个黄色星标,表示它是最喜欢的。
listView.setOnItemLongClickListener (new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
Toast.makeText(getContext(), "Saved as Favorite", Toast.LENGTH_SHORT).show();
int c = listView.getChildCount();
for (int i = 0; i < c; i++)
{
View view2 = listView.getChildAt(i);
ContactHolder hld = (ContactHolder)view2.getTag();
if (hld.tag == id)
{
// update view
hld.hasStar = 1;
hld.img.setVisibility(View.VISIBLE);
break;
}
}
return true;
}
});
}
最后,这是我用来表示listview中每个列表项的XML文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_margin="0dp"
android:id="@+id/choicelayout"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:layout_gravity="center"
android:layout_weight="1"
android:visibility="gone"
app:srcCompat="@android:drawable/btn_star"/>
<TextView
android:id="@+id/tvContactListName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:gravity="center"
android:layout_gravity="center"
android:layout_marginRight="8dp"
android:layout_weight="1"
android:layout_marginLeft="8dp"
android:textColor="@color/color_black"
android:textSize="20sp"
android:text="MEHUL RUGHANI"/>
</LinearLayout>
</LinearLayout>
答案 0 :(得分:0)
您的代码首先标记为收藏夹,但没有代码可以不喜欢该项目。
if (hld.tag == id) {
// update view
hld.hasStar = 1;
hld.img.setVisibility(View.VISIBLE);
break;
}
一旦项目被标记为收藏,将保留终生的最爱。你应该加上这个:
if (hld.tag == id) {
if (hld.hasStar == 1) {
hld.hasStar = 0;
hld.img.setVisibility(View.GONE);
} else {
hld.hasStar = 1;
hld.img.setVisibility(View.VISIBLE);
break;
}
}