Android, Custom ListAdapter получает TextView-Text

Я закодировал собственный адаптер и добавил его в свой ListActivity через ListView. Причина, по которой я написал собственный адаптер, заключается в том, что мне пришлось внести некоторые изменения в список в записи списка. В каждой записи списка у меня есть 3 TextViews.

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:padding="6dip"> <TextView android:id="@+id/myNr" android:layout_width="40dip" android:layout_height="fill_parent" android:layout_marginRight="15dip" android:text="id" android:textSize="25dip" android:background="#333333" android:gravity="center_horizontal"/> <LinearLayout android:orientation="vertical" android:layout_width="0dip" android:layout_weight="1" android:layout_height="fill_parent"> <TextView android:id="@+id/editor" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center_vertical" android:text="Editor: " /> <TextView android:id="@+id/date" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:singleLine="true" android:ellipsize="marquee" android:text="Date: " /> </LinearLayout> 

Следующее, что я сделал, – это реализовать «onListItemClick-Methode». Впоследствии я реализовал onListItemLongClick-Listener со следующим кодом:

In onCreate of Activity Я добавил:

  registerForContextMenu(getListView()); 

Затем я добавил следующий метод:

 Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo){ AdapterView.AdapterContextMenuInfo info; info = (AdapterView.AdapterContextMenuInfo) menuInfo; long id = getListAdapter().getItemId(info.position); } 

Где «id» – это индекс элемента в списке. Теперь я хочу получить текст texview с id = "myNr этого ListItem. Есть ли способ получить этот текст?

view – элемент списка, так что вы можете сделать

 String s =(String) ((TextView) view.findViewById(R.id.myNr)).getText(); 

Просто возьмите ссылку на текстовое представление, если вы расширяете базовый адаптер, например

 Listener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { TextView tx =(TextView)view.findViewById(R.id.text); String s = tx.getText().toString(); Log.d(TAG, "string : "+s); 

Привет, ребята, я нашел другой способ установить ItemLongClickListener. Поэтому я также нашел способ получить текст, который я показываю.

 ListView lv = getListView(); lv.setOnItemLongClickListener(new OnItemLongClickListener(){ @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int row, long arg3) { String[] tmp = (String[]) arg0.getItemAtPosition(row); //tmp[0] ist the Text of the first TextView displayed by the clicked ListItem return true; }}); 

Я не нашел ни одного из вышеперечисленных решений для работы. В качестве альтернативы вы можете:

 getListView().setOnItemLongClickListener(new OnItemLongClickListener() { public boolean onItemLongClick(AdapterView<?> arg0, View v,int position, long id) { Cursor c = (Cursor) arg0.getItemAtPosition(position); String tableValue = c.getString(1); return true; } }); 

Лучшее решение, которое я нашел, было:

 @Override public void onCreateContextMenu(ContextMenu menu, View view,ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, view, menuInfo); AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; ViewGroup vg = (ViewGroup) view; View children = vg.getChildAt(info.position); TextView child = (TextView) children.findViewById(R.id.text1); String s= child.getText().toString(); menu.setHeaderTitle(s); menu.add(0, view.getId(), 0, "Serve"); menu.add(0, view.getId(), 0, "View"); } 

Если вы ищете TextView в позиции объекта, который человек долго нажимает, вы можете получить его, используя что-то вроде этого:

 String s = ((TextView) view.getItemAtPosition(info.position)).getText(); 

Да, я так и думал. Но когда я реализую это, я просто получаю текст первого TextView в списке. Это означает, что я могу получить текст желаемого TextView, но он всегда является текстом первого списка. Не существует ли возможности добавить запись longClickedList?

Спасибо за вашу помощь, но я боюсь, что он все еще не работает. Если я добавлю строку, которую вы предложили, она подчеркивает «getItemAtPosition» и говорит: – Метод getItemAtPosition (int) не определен для типа View–

Он предлагает отобразить представление в AdapterView, поэтому он выглядит следующим образом:

 String s = ((TextView) ((AdapterView<ListAdapter>) view).getItemAtPosition(info.position)).getText(); 

Когда я запустил это и сделаю длинный щелчок по элементу, я получаю «ClassCastException»,

В этом методе вы получите элемент, связанный с вашим элементом списка.

 @Override public boolean onContextItemSelected(MenuItem aItem) { AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) aItem.getMenuInfo(); Object entity = (Object) todoList.getAdapter().getItem(menuInfo.position); switch (aItem.getItemId()) {} } 
 list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view,int position, long id) { String title = (String) ((TextView)view.findViewById(R.id.title)).getText(); String artist=(String)((TextView)view.findViewById(R.id.artist)).getText(); //System.out.println(s); Toast.makeText(CustomizedListView.this,"Title = "+title+"\n"+"Artist = "+artist, Toast.LENGTH_SHORT).show(); } }); 

У меня был ArrayList ArrayLists в качестве источника данных для CustomAdapter, поэтому я использую

 menu.setHeaderTitle(Messages.get(info.position).getUserName()); 

Используя HashMap

 getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { HashMap m = (HashMap) getListView().getItemAtPosition(position); System.out.println("itemClick: position = " + position + ", id = " + id + " o = " + m.get("YOUR_KEY")); } });