自定义ListView没有更新它应该的方式

时间:2018-04-11 05:38:49

标签: java android

我正在创建一个包含带有联系人的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>

1 个答案:

答案 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;
    }
}