#android
#Android
Вопрос:
Я выполнил синтаксический анализ xml и смог отобразить один элемент массива в виде списка. но я хочу отобразить 2 элемента массива в одном списке … используя адаптер массива .. означает, что я хочу array_barrio и array_ciudad оба в одном представлении списка, как я могу сделать this…my класс Java является
public class XMLParsingExample extends ListActivity {
String name = null;
private String array_estado[];
private String[] array_ciudad;
private String array_barrio[];
/** Create Object For SiteList Class */
SitesList sitesList = null;
/** Called when the activity is first created. */
@SuppressWarnings("unchecked")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listplaceholder);
/** Create a new layout to display the view */
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(1);
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
/** Send URL to parse XML Tags */
URL sourceUrl = new URL(
"http://www.arteonline.mobi/iphone/output.php?key=Buenos");
MyXMLHandler myXMLHandler = new MyXMLHandler();
xr.setContentHandler(myXMLHandler);
xr.parse(new InputSource(sourceUrl.openStream()));
} catch (Exception e) {
System.out.println("XML Pasing Excpetion = " e);
}
sitesList = MyXMLHandler.sitesList;
array_ciudad = new String[sitesList.getEstado().size()];
for (int i = 0; i < sitesList.getEstado().size(); i )
{
name = sitesList.getEstado().get(i);
array_ciudad[i] = name;
Log.i("array_spinner" i, array_ciudad[i]);
}
array_barrio = new String[sitesList.getBarrio().size()];
for (int i = 0; i < sitesList.getBarrio().size(); i )
{
name = sitesList.getBarrio().get(i);
array_barrio[i] = name;
// Log.i("array_spinner" i, array_ciudad[i]);
}
setListAdapter(new ArrayAdapter(this,
android.R.layout.simple_list_item_1, array_barrio));
// setListAdapter(new ArrayAdapter(this,
// android.R.layout.simple_list_item_1, array_barrio ));
}
Ответ №1:
Вы можете создать новую строку [], достаточно большую, чтобы вместить оба, а затем скопировать элементы каждого массива в новый массив. Используйте новый массив в вашем ArrayAdapter.
String[] bigArray = new String[array_barrio.length array_ciudad.length];
System.arraycopy(array_barrio, 0, bigArray, 0, array_barrio.length);
System.arraycopy(array_ciudad, array_barrio.length, bigArray, array_barrio.length, array_ciudad.length);
Еще одна вещь, которую стоит рассмотреть, — это изначально создать bigArray и просто добавить оба набора элементов в большой массив, а не в меньшие.
Комментарии:
1. @ nicholas я использовал приведенные выше строки и передал большой массив адаптеру массива для его закрытия .. setListAdapter (новый ArrayAdapter(этот, android.R.layout.simple_list_item_1, bigArray));
2. 05-18 11:31:30.015: ОШИБКА / AndroidRuntime (753): Вызвана: java.lang. Исключение ArrayIndexOutOfBoundsException: src.length=3 srcPos= 3 dst.length= 6 dstPos = 3 длина=3
Ответ №2:
Вы хотите объединить два элемента массива и сделать его одним. затем вы можете последовать примеру Николаса. Добавьте оба массива и сделайте их одним массивом и передайте массив в ArrayAdapter. Но если вы хотите отобразить данные обоих массивов в одном списке, тогда вам нужно использовать BaseAdapter и написать для этого свою собственную логику.
Спасибо
Дипак
Комментарии:
1. привет, Дипак .. когда я объединяю два элемента массива и делаю его одним, тогда также отображаются оба элемента массива в одном списке … и, как вы сказали во втором трюке для отображения данных обоих массивов в одном списке, также отображаются данные в одном списке, тогда в чем будет разница между двумя … пожалуйста, пожалуйста, объясните…
2. означает, что при использовании адаптера массива после объединения он принимает вид массива, а при использовании базового адаптера мы можем реализовать более 10r2 элементов в одном представлении списка, что может изменить номер строки в том же представлении списка????
Ответ №3:
Если вы хотите отобразить более одного элемента в элементе просмотра списка, вы можете использовать свой собственный адаптер, расширив BaseAdapter. Но сначала array_ciudad
и array_barrio
должны быть одинакового размера.
Каждый элемент должен быть представлен макетом элемента списка, подобным приведенному ниже. Этот макет необходимо будет поместить в res/layout
каталог.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Location where barrio items will be displayed -->
<TextView android:id="@ id/barrio"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
<!-- Location where ciudad items will be displayed -->
<TextView android:id="@ id/ciudad"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
В этом примере пользовательского адаптера предполагается, что array_barrio и array_ciudad будут иметь одинаковую длину. Все, что вам действительно нужно сделать, это создать представление для элементов списка, увеличив макет и вставив свои строки в TextViews там, где это необходимо. В этом примере MyAdapter
должен быть внутренний класс XMLParsingExample
, предоставляющий ему прямой доступ к определенным вами свойствам массива.
protected class MyAdapter extends BaseAdapter {
private LayoutInflater inflater;
public MyAdapter(Context ctx) {
super();
this.inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return XMLParsingExample.this.array_barrio.length;
}
/* Not implemented but not really needed */
@Override
public Object getItem(int position) {
return null;
}
/* Not implemented but not really needed */
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = inflater.inflate(R.layout.listitem_layout, parent, false);
Course c = courses.get(position);
String barrio = XMLParsingExample.this.array_barrio[position];
String ciudad = XMLParsingExample.this.array_ciudad[position];
TextView tv = (TextView) v.findViewById(R.id.barrio);
tv.setText(barrio);
tv = (TextView) v.findViewById(R.id.ciudad);
tv.setText(ciudad);
return v;
}
}
Комментарии:
1. Как сказал @Deepak, если вы хотите объединить два массива, просто используйте метод от @nicholas. hauschild. Но это должно быть полезно, если вы хотите отобразить два или более элементов / строк в одном элементе списка.
2. уважаемый сэр … прежде всего, v v спасибо за использование вами полного ответа.. будут ли какие-либо изменения в XMLParsingExample.java класс ???? так что не используйте адаптер массива inXMLParsingExample.java ???
3. @atul-yadav Пока ваш синтаксический анализ XML работает нормально, единственное изменение, которое вам потребуется, это добавить
MyAdapter
класс в качестве внутреннего класса вXMLParsingExample
. Тогда не используйте,ArrayAdapter
вместо этого используйтеnew MyAdapter(this)
. Если вы используете,ListActivity
то в концеonCreate
вам понадобитсяsetListAdapter(adapter);
.