Android ListView获取最后选择的项目,并从onItemClick中的其他ListView获取最后选择的项目

时间:2014-03-20 15:14:21

标签: android android-listview android-adapter

我有两个ListView。它们都使用相同的适配器。我想从这两个列表中选择互斥的项目。对于列表视图中的每个项目,我都有布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView android:id="@+id/type_of_support"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:layout_marginLeft="@dimen/left_screen_margin"
        android:textSize="@dimen/type_of_support_font_size"/>

    <ImageView android:id="@+id/img_checked_type"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="30dp"
        android:src="@drawable/ic_check"
        android:visibility="invisible"/>
</RelativeLayout> 

选择项目时,我会看到图像。

我不知道如何从listview获取最后选择的视图以及如何从其他列表视图中通过id获取选定的视图。

我阅读了ListView,Adapter,AdapterView的文档,但找不到解决方案

final TypeOfSupportAdapter quoteToCashAdapter = new TypeOfSupportAdapter(SelectionTypeOfSupport.this, R.layout.lv_type_of_support, quoteToCashEngagementsList);
        final TypeOfSupportAdapter pointRequestsAdapter = new TypeOfSupportAdapter(SelectionTypeOfSupport.this, R.layout.lv_type_of_support, pointRequestsList);
        final ListView quoteToCashListView = (ListView) findViewById(R.id.quote_to_cash_list);
        quoteToCashListView.setAdapter(quoteToCashAdapter);
        quoteToCashListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                if (countCheckedTypeOfSupport == 0 && positionCurItemInQuoteToCashList < 0) {
                    ImageView checkTypeOfSupportImageView = (ImageView) view.findViewById(R.id.img_checked_type);
                    checkTypeOfSupportImageView.setVisibility(View.VISIBLE);
                    countCheckedTypeOfSupport++;
                } else if (countCheckedTypeOfSupport == 1 && positionCurItemInQuoteToCashList >= 0) {
                    if (position != positionCurItemInQuoteToCashList) {
                        ImageView previouslyCheckedImage = (ImageView)  view.findViewById(R.id.img_checked_type); //get previous view
                        previouslyCheckedImage.setVisibility(View.INVISIBLE);
                        ImageView checkTypeOfSupportImageView = (ImageView) view.findViewById(R.id.img_checked_type);
                        checkTypeOfSupportImageView.setVisibility(View.VISIBLE);
                    } else {
                        countCheckedTypeOfSupport = 0;
                        positionCurItemInQuoteToCashList = -1;
                        ImageView checkTypeOfSupportImageView = (ImageView) view.findViewById(R.id.img_checked_type);
                        checkTypeOfSupportImageView.setVisibility(View.INVISIBLE);
                    }
                } else {
                    ImageView previouslyCheckedImage = (ImageView) pointRequestsAdapter.getView(positionCurItemInQuoteToCashList, null, null).findViewById(R.id.img_checked_type); //getView from other listview
                    previouslyCheckedImage.setVisibility(View.INVISIBLE);
                    ImageView checkTypeOfSupportImageView = (ImageView) view.findViewById(R.id.img_checked_type);
                    checkTypeOfSupportImageView.setVisibility(View.VISIBLE);
                    positionCurItemInQuoteToCashList = -1;
                }
                positionCurItemInQuoteToCashList = position;

                Log.i(TAG, "1. countCheckedTypeOfSupport " + countCheckedTypeOfSupport + " positionCurItemInQuoteToCashList " + positionCurItemInQuoteToCashList + " positionCurItemInPointRequestList" + positionCurItemInPointRequestList);
            }
        });


        ListView pointRequestsListView = (ListView) findViewById(R.id.point_requests_list);
        pointRequestsListView.setAdapter(pointRequestsAdapter);
        pointRequestsListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                if (countCheckedTypeOfSupport == 0 && positionCurItemInPointRequestList < 0) {
                    ImageView checkTypeOfSupportImageView = (ImageView) view.findViewById(R.id.img_checked_type);
                    checkTypeOfSupportImageView.setVisibility(View.VISIBLE);
                    countCheckedTypeOfSupport++;
                } else if (countCheckedTypeOfSupport == 1 && positionCurItemInPointRequestList >= 0) {
                    if (position != positionCurItemInPointRequestList) {
                        ImageView previouslyCheckedImage = (ImageView) view.findViewById(R.id.img_checked_type); // get previous view
                        previouslyCheckedImage.setVisibility(View.INVISIBLE);
                        ImageView checkTypeOfSupportImageView = (ImageView) view.findViewById(R.id.img_checked_type);
                        checkTypeOfSupportImageView.setVisibility(View.VISIBLE);
                    } else {
                        countCheckedTypeOfSupport = 0;
                        positionCurItemInQuoteToCashList = -1;
                        ImageView checkTypeOfSupportImageView = (ImageView) view.findViewById(R.id.img_checked_type);
                        checkTypeOfSupportImageView.setVisibility(View.INVISIBLE);
                    }
                } else {
                    ImageView previouslyCheckedImage = (ImageView) quoteToCashAdapter.getView(positionCurItemInPointRequestList, null, null).findViewById(R.id.img_checked_type); //getView from other listview
                    previouslyCheckedImage.setVisibility(View.INVISIBLE);
                    ImageView checkTypeOfSupportImageView = (ImageView) view.findViewById(R.id.img_checked_type);
                    checkTypeOfSupportImageView.setVisibility(View.VISIBLE);
                    positionCurItemInQuoteToCashList = -1;
                }
                positionCurItemInPointRequestList = position;

                Log.i(TAG, "1. countCheckedTypeOfSupport " + countCheckedTypeOfSupport + " positionCurItemInQuoteToCashList " + positionCurItemInQuoteToCashList + " positionCurItemInPointRequestList" + positionCurItemInPointRequestList);
            }
        });

有人可以帮我解决这个问题吗?

//修订版

private class TypeOfSupportAdapter extends ArrayAdapter<String> {
        private Context context;
        private List<String> typeOfSupportList;
        private int resourceId;

        public TypeOfSupportAdapter(Context context, int resource, List<String> objects) {
            super(context, resource, objects);
            this.context = context;
            this.resourceId = resource;
            this.typeOfSupportList = objects;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
            View rowView = layoutInflater.inflate(resourceId, parent, false);

            String curTypeOfSupport = typeOfSupportList.get(position);
            TextView typeOfSupport = (TextView) rowView.findViewById(R.id.type_of_support);
            typeOfSupport.setText(curTypeOfSupport);
            return rowView;
        }
    }

2 个答案:

答案 0 :(得分:1)

您应该在您的适配器中实现您的选择逻辑,只需传输一个标志以检测您从哪个列表中选择该项目。你能展示你的适配器代码,你在pointRequestsList中添加了什么? 创建类

class YourItemClass
{
  public boolean selected;
//...
}

现在为每个listView创建两个列表:

 ArrayList<YourItemClass> list1 = new ArrayList<YourItemClass>();
 ArrayList<YourItemClass> list2 = new ArrayList<YourItemClass>();

将此列表传输到适配器,例如列表#1:

final TypeOfSupportAdapter pointRequestsAdapter = new TypeOfSupportAdapter(SelectionTypeOfSupport.this, R.layout.lv_type_of_support, list1); 
final ListView quoteToCashListView = (ListView) findViewById(R.id.quote_to_cash_list);
quoteToCashListView.setAdapter(quoteToCashAdapter);
quoteToCashListView.setOnItemClickListener(new OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
         list1.get(position).selected = !list1.get(position).selected;
      quoteToCashAdapter.notifyDataSetChanged();
      }

使用list2

为另一个listView做同样的事情

现在在你的适配器中使用它,例如

public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
row = inflater.inflate(mResourse, parent, false);  
final ImageView image = (ImageView) row.findViewById(R.id.yourImage);

if(transferedList.get(position).selected)
   image.setVisibility(View.VISIBLE);
else
   image.setVisibility(View.INVISIBLE);
}

现在你有两个带有挑选物品的清单(如果是list1.get(位置),则选择。选择== true)

如果您有任何疑问 - 请问 抱歉我的英语不好:)

答案 1 :(得分:0)

我解决了我的问题。这是我的代码

 private List<TypeOfSupport> quoteToCashEngagementsList;
        private List<TypeOfSupport> pointRequestsList;
        private int positionCurItemInQuoteToCashList = -1;
        private int positionCurItemInPointRequestList = -1;

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.select_type_of_support);

            Resources resources = getResources();
            initQuoteToCashEngagements(resources);
            initPointRequests(resources);

            final TypeOfSupportAdapter quoteToCashAdapter = new TypeOfSupportAdapter(SelectionTypeOfSupport.this, R.layout.lv_type_of_support, quoteToCashEngagementsList);
            final TypeOfSupportAdapter pointRequestsAdapter = new TypeOfSupportAdapter(SelectionTypeOfSupport.this, R.layout.lv_type_of_support, pointRequestsList);
            final ListView quoteToCashListView = (ListView) findViewById(R.id.quote_to_cash_list);
            quoteToCashListView.setAdapter(quoteToCashAdapter);
            quoteToCashListView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                    if(positionCurItemInQuoteToCashList != -1){
                       quoteToCashEngagementsList.get(positionCurItemInQuoteToCashList).setChecked(false);
                    }
                    if(positionCurItemInPointRequestList != -1){
                        pointRequestsList.get(positionCurItemInPointRequestList).setChecked(false);
                        pointRequestsAdapter.notifyDataSetChanged();
                    }
                    quoteToCashEngagementsList.get(position).setChecked(true);
                    positionCurItemInQuoteToCashList = position;
                    quoteToCashAdapter.notifyDataSetChanged();

                    positionCurItemInPointRequestList = -1;
                }
            });


            ListView pointRequestsListView = (ListView) findViewById(R.id.point_requests_list);
            pointRequestsListView.setAdapter(pointRequestsAdapter);
            pointRequestsListView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                    if(positionCurItemInPointRequestList != -1){
                        pointRequestsList.get(positionCurItemInPointRequestList).setChecked(false);
                    }
                    if(positionCurItemInQuoteToCashList != -1){
                        quoteToCashEngagementsList.get(positionCurItemInQuoteToCashList).setChecked(false);
                        quoteToCashAdapter.notifyDataSetChanged();
                    }

                    pointRequestsList.get(position).setChecked(true);
                    positionCurItemInPointRequestList = position;
                    pointRequestsAdapter.notifyDataSetChanged();

                    positionCurItemInQuoteToCashList = -1;

                }
            });
}



private class TypeOfSupportAdapter extends ArrayAdapter<TypeOfSupport> {
        private Context context;
        private List<TypeOfSupport> typeOfSupportList;
        private int resourceId;


        public TypeOfSupportAdapter(Context context, int resource, List<TypeOfSupport> objects) {
            super(context, resource, objects);
            this.context = context;
            this.resourceId = resource;
            this.typeOfSupportList = objects;
        }

        @Override
        public TypeOfSupport getItem(int position) {
            return typeOfSupportList.get(position);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
            View rowView = layoutInflater.inflate(resourceId, parent, false);

            TypeOfSupport curTypeOfSupport = typeOfSupportList.get(position);
            TextView typeOfSupport = (TextView) rowView.findViewById(R.id.type_of_support);
            typeOfSupport.setText(curTypeOfSupport.getTypeOfSupport());
            ImageView checkImage = (ImageView) rowView.findViewById(R.id.img_checked_type);
            if(curTypeOfSupport.isChecked()){
                checkImage.setVisibility(View.VISIBLE);
            } else {
                checkImage.setVisibility(View.INVISIBLE);
            }

            return rowView;
        }
    }