ListView 项目选择问题。选中一个就取消选中其他

ListView item selection issue. Deselect others when one selected

我有一个自定义列表视图:http://i.stack.imgur.com/oBCCG.png

单击 'ListView' 的项目后,'ImageView' 和 "mark" 变为可见。

但问题是我只需要标记一项。如何在点击时 取消选择 所有其他项目?

CustomList 适配器:

    private class TimeZoneItemAdapter extends ArrayAdapter<String> {
    private Activity myContext;
    private ArrayList<String> datas;

    public TimeZoneItemAdapter(Context context, int textViewResourceId, ArrayList<String> objects) {
        super(context, textViewResourceId, objects);

        myContext = (Activity) context;
        datas = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
        if (convertView == null) {
            LayoutInflater inflater = myContext.getLayoutInflater();

            convertView = inflater.inflate(R.layout.listview_item, null);

            viewHolder = new ViewHolder();
            viewHolder.postNameView = (TextView) convertView.findViewById(R.id.listview_item);
            viewHolder.postImageView = (ImageView) convertView.findViewById(R.id.image_mark);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.postNameView.setText(datas.get(position));

        viewHolder.postNameView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//How to deselect all other items here?
                if (viewHolder.postImageView.getVisibility() != View.VISIBLE) {
                    viewHolder.postImageView.setVisibility(View.VISIBLE);
                } else {
                    viewHolder.postImageView.setVisibility(View.INVISIBLE);
                }
            }
        });

        return convertView;
    }

    class ViewHolder {
        TextView postNameView;
        ImageView postImageView;
    }

}

设置适配器:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_time_zone, container, false);

    // Set the adapter
    mListView = (ListView) view.findViewById(R.id.listView_timezones);
    imageCheck = (ImageView) view.findViewById(R.id.image_mark);

    mListView.setAdapter(new TimeZoneItemAdapter(
            getActivity(),
            R.layout.listview_item,
            dataTimezones.getZonesList()
    ));

    return view;
}

感谢您的帮助!

您可能希望在专用整数变量中跟踪当前选定的列表视图项位置。然后,每次选择一个项目时,您只需要在适配器上调用 notifyDataSetChanged(),并将 ImageView 设置为在 getView() 中可见,如果 yourSelectedPosition == position

另请查看 ListView 上的 setOnItemClickListener() 方法。

编辑: 这是一些代码。

首先在 Activity 中将侦听器附加到 ListView:

listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
        timeZoneItemAdapter.selectedPosition = position;
        timeZoneItemAdapter.notifyDataSetChanged();
    }
});

适配器应如下所示:

private class TimeZoneItemAdapter extends ArrayAdapter<String> {
    private Activity myContext;
    private ArrayList<String> datas;

    public int selectedPosition = -1;

    public TimeZoneItemAdapter(Context context, int textViewResourceId, ArrayList<String> objects) {
        super(context, textViewResourceId, objects);

        myContext = (Activity) context;
        datas = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null)
            convertView = myContext.getLayoutInflater().inflate(R.layout.listview_item, null);

        TextView postNameView = (TextView) convertView.findViewById(R.id.listview_item);
        ImageView imageMark = (ImageView) convertView.findViewById(R.id.image_mark);

        postNameView.setText(datas.get(position));

        imageMark.setVisibility(selectedPosition == position ? View.VISIBLE : View.GONE);

        return convertView;
    }

}

此解决方案摆脱了 ViewHolder,但它对您有用吗?