ListView项目选择问题。选择一个时取消选择其他人

时间:2015-03-21 16:09:38

标签: android listview android-listview android-adapter

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

单击“ListView”项目时,带有“标记”的“ImageView”变为可见。

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

另请查看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,但它能为您工作吗?