WedX - журнал о программировании и компьютерных науках

Как получить имя | Пара значений в Listview для нескольких проверенных элементов?

Мое представление списка работает нормально и заполняет все элементы из курсора. мне нужно назначить получить идентификатор назначенного имени в представлении списка. Я использую несколько флажков для выбора элементов из списка. Как получить пару "Имя|Значение" из списка для выбранных элементов?

   ListView listView;
    ArrayAdapter<String> adapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        try
        {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.servicelist_item);

        //String[] sports ;


        //get jobtype 
        Cursor cur=dbHelper.fetchByJobNumber(stringJobnumber);
        String cur_type;
        cur_type=cur.getString(18);

        //passing jobtype to fetch service items through cursor
        Cursor cursor=dbHelper.fetchItemsByType(cur_type);
        ArrayList<String> sports=new ArrayList<String>();
        if (cursor.moveToFirst()) 
        {
           do 
           {
               //assigning cursor items to arraylist variable sports
              /* assigning item name to list view*/
              /*My cursor holds name value pair */
               sports.add(cursor.getString(3)); 
           } 
           while (cursor.moveToNext());
        }



        //setting array adapter to populate listView
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice, sports);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView.setAdapter(adapter);

        button.setOnClickListener(this);
    }
    catch(Exception e)
    {
        System.out.println(e);
    }

   }

//Метод по клику

 public void onClick(View v) 
    {
        SparseBooleanArray checked = listView.getCheckedItemPositions();
        ArrayList<String> selectedItems = new ArrayList<String>();
        for (int i = 0; i < checked.size(); i++) 
        {
            // Item position in adapter
            int position = checked.keyAt(i);
            // Add sport if it is checked i.e.) == TRUE!
            if (checked.valueAt(i))
                selectedItems.add(adapter.getItem(position));
        }

        final String[] outputStrArr = new String[selectedItems.size()];
        Log.e("selectedItems.size()====>>", ""+selectedItems.size());
        for (int i = 0; i < selectedItems.size(); i++) 
        {
            Log.e("selectedItems====>>", ""+selectedItems.get(i));
            outputStrArr[i] = selectedItems.get(i);
        } 
    }
30.01.2015

Ответы:


1

Глядя на ваш код, я бы создал объект, который содержит ваше имя и идентификатор:

public class Sport {
     private String id;
     private String name;
     public Sport(String id, String name){
        this.id = id;
        this.name = name;
     }

     public String getId(){
         return id;
     }

     public String getName(){
         return name;
      }
}

Мне часто нужна была эта функция, поэтому я создал собственный адаптер, который имеет String[] идентификаторов, List<T> для ваших данных и карту <String, T>. Это дает вашему списку несколько приятных функций, таких как доступ по идентификатору и позиции. Если этот адаптер будет поддерживать 3 экземпляра данных, я рекомендую использовать его только для относительно небольших списков (менее 100).

Вот адаптер, который мне нравится использовать:

public abstract class MappedAdapter<T> extends BaseAdapter{

    private Context mContext;
    private Map<String, T> mMap;
    private ArrayList<String> mIdList;

    public MappedAdapter(Context context, ArrayList<T> arrayList) {
        this.mContext = context;
        mMap = new HashMap<>();
        mIdList = new ArrayList<>();
        for (T object : arrayList) {
            add(object);
        }
    }

    public MappedAdapter(Context context, T[] arrayList){
        this.mContext = context;
        mMap = new HashMap<>();
        mIdList = new ArrayList<>();
        for (T object : arrayList) {
            add(object);
        }
    }

    public abstract String getObjectId(T object);

    public abstract String getObjectString(T object);

    public T getObject(int position) {
        return mMap.get(mIdList.get(position));
    }

    public String getObjectId(int position){
        return mIdList.get(position);
    }

    public boolean add(T object) {
        final String id = getObjectId(object);
        if(!mMap.containsKey(id)){
            mIdList.add(id);
            mMap.put(id, object);
            this.notifyDataSetChanged();
            return true;
        }
        return false;
    }

    public void remove(T object){
        final String id = getObjectId(object);
        mIdList.remove(id);
        mMap.remove(id);
        this.notifyDataSetChanged();
    }

     @SuppressWarnings("unchecked")
    public Map.Entry<String, T> getEntry(int position){
         HashMap<String, T> entry = new HashMap<>();
         String key = mIdList.get(position);
         entry.put(key, mMap.get(key));
         return (Map.Entry<String, T>) entry;
     }

    @Override
    public int getCount() {
        return mMap.size();
    }

    @Override
    public Object getItem(int position) {
        return mMap.get(mIdList.get(position));
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        T object = mMap.get(mIdList.get(position));
        if (view == null) {
            int layoutResource = android.R.layout.simple_list_item_1;
            view = LayoutInflater.from(mContext).inflate(layoutResource, null);
        }
        TextView tv = (TextView) view.findViewById(android.R.id.text1);
        tv.setText(getObjectString(object));
        return view;
    }
}

Это класс адаптера, который я часто использую, вы просто передаете его в список, и вы можете получить к нему доступ по идентификатору и положению. И не позволит дублировать объекты. Требуется универсальный, поэтому вы можете использовать его для многих разных объектов.

Это попросит вас переопределить два метода:

  1. getObjectId() Идентификатор объекта — это то, что он будет использовать в качестве идентификатора/ключа для построения карты.
  2. getObjectString() objectString — это строка, которую вы хотите отобразить в представлении списка.

По умолчанию для макета будет использоваться android.R.layout.simple_list_item_1. Очевидно, вы можете изменить это или, что еще лучше, создать подкласс и переопределить getView()


Использование:

   MappedAdapter<Sport> mappedAdapter = new MappedAdapter<Sport>(context, sports){
        @Override
        public String getObjectId(Sport object) {
            return object.getId();
        }

        @Override
        public String getObjectString(Sport object) {
            return object.getName();
        }
    };

    ListView listView =  ... ;
    listView.setAdapter(mappedAdapter);

Чтобы получить пару Key|Value, вы можете получить ее по позиции:

   Map.Entry<String, Sport> entry = mappedAdapter.getEntry(positon);
   String key = entry.getKey();
   Sport sport = entry.getValue();

Дайте мне знать, если вам нужны какие-либо разъяснения. Рад помочь.

30.01.2015
  • Именно то, что мне было нужно, спасибо! 05.04.2021
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]