показать элемент в виде списка после синтаксического анализа sax xml

#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); .