Дать теги элементов списка без пользовательского массива

У меня вопрос, который должен быть простым, но я не могу его решить.

Я использую DragSortListView . Я хочу дать каждому элементу listview-item тег с его исходным местоположением. Когда пользователь выполнит переупорядочение, я хочу вернуть строку с исходным идентификатором (например, 2,3,4,1, если пользователь переместил первый элемент на последнее место). Если элемент удален, я также хотел бы узнать идентификатор orignal.

Вот мой код.

DragSortListView mainListView = (DragSortListView) findViewById( R.id.list_pages ); String[] names = settings.getString("pages", "Error,error").split(","); ArrayList<String> list = new ArrayList<String>(Arrays.asList(names)); adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.row, list); mainListView.setAdapter(adapter); DragSortController controller = new DragSortController(mainListView); ... 

Теперь я подумал, что лучше всего просмотреть все элементы и дать им теги с их исходными идентификаторами. Я пытаюсь перебрать элементы, используя что-то вроде этого

 for (int i = 0; i < mainListView.getCount(); i++) { View v = mainListView.getChildAt(i); TextView tx = (TextView) v.findViewById(R.id.text); tx.setTag(i); } 

Однако этот список выглядит пустым, даже если адаптер установлен.

Я не могу использовать настраиваемый ArrayAdapter, так как приложение будет сбой при удалении или удалении элемента.

Дополнительная информация: Список просматривается, когда данные возвращаются службой с помощью BroadcastReceiver. Я не думаю, что это влияет на это, но вы никогда не знаете.

Мой вопрос:

  • Как сохранить каждую позицию списка элементов, чтобы я мог получить к ней доступ позже?

Заранее спасибо!

Solutions Collecting From Web of "Дать теги элементов списка без пользовательского массива"

Если вы не хотите использовать пользовательский Adapter , вы можете просто сделать это следующим образом:

  List<Item> dataForTheAdapter = new ArrayList<Item>(); // 'dataRetrivedfromService' is the data, that gets returned by the service for (int counter = 0; counter < dataRetrivedfromService.size(); counter++) { dataForTheAdapter.add(new Item(dataRetrivedfromService.get(counter), counter)); } mContext = MyActivity.this; mAdapter = new ArrayAdapter<Item>(mContext, R.layout.row, dataForTheAdapter); ListView listView = (ListView) findViewById(R.id.listView); listView.setAdapter(mAdapter); 

Этот код довольно понятен. Теперь, глядя на класс Item.java, вы увидите, что я переопределил метод toString() . Метод toString() get вызывается на предоставленный объект, который ListView хочет заполнить своими данными.

 public class Item { private String mText; private int mPosition; public Item(String text, int position) { this.mText = text; this.mPosition = position; } public int getPosition() { return mPosition; } public void setPosition(int position) { this.mPosition = position; } public String getText() { return mText; } public void setText(String text) { this.mText = text; } @Override public String toString() { return this.mText; } } 

Теперь вам не придется писать настраиваемый адаптер, но вы можете заполнить свой ListView объектом Item.

Чтобы проверить это, если он работает, вы можете установить OnItemClickListener в ListView и сделать это:

  listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(mContext, String.valueOf(mAdapter.getItem(position).getPosition()), Toast.LENGTH_SHORT).show(); } });