0

次のような XML ファイルからデータを取得しています。

   <posts>
          <page id="1">
                      <title>
                            <![CDATA[ Tile no. 1 ]]>
                      </title>

                      <smallimage>
                                 http://www.xyz.com/right.jpg
                      </smallimage>
          </page>

          <page id="2">
                      <title>
                            <![CDATA[ Tile no. 2 ]]>
                      </title>
          </page>

          <page id="3">
                      <title>
                            <![CDATA[ Tile no. 3 ]]>
                      </title>

                      <smallimage>
                                 http://www.xyz.com/left.jpg
                      </smallimage>
          </page>
  </posts>

これは、要素とを取得している XML の例です。3 か 6 か 1 かもしれません。

私のコードでは、SAX パーサーを使用してこの XML ファイルを解析しています。データを取得し、リスト ビューに表示できますが、画像を一緒に表示できます。

画像を表示するには、LazlyList Example (ImageLoader Class) を使用しています。

以下は私のコードです: -

MainActivity.java

public class MainActivity extends Activity {
    /** Called when the activity is first created. */

    static final String URL = "http://www.xyz.com/api.php?page_id=1";

    ItemList itemList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        XMLParser parser = new XMLParser();
        String XML = parser.getXmlFromUrl(URL);

        System.out.println("This XML is ========>"+XML);

       try
       {
           SAXParserFactory spf = SAXParserFactory.newInstance();
           SAXParser sp = spf.newSAXParser();
           XMLReader xr = sp.getXMLReader();

           /** Create handler to handle XML Tags ( extends DefaultHandler ) */
           MyXMLHandler myXMLHandler = new MyXMLHandler();
           xr.setContentHandler(myXMLHandler);

           ByteArrayInputStream is = new ByteArrayInputStream(XML.getBytes());
           xr.parse(new InputSource(is));
      }
      catch(Exception e)
      {

      }

      itemList = MyXMLHandler.itemList;

      ArrayList<String> listItem= itemList.getTitle();
      ArrayList<String> listManu = itemList.getSmallimages();


      System.out.println("(ListItem)=======>"+listItem);
      System.out.println("(ListManu)=======>"+listManu);

    //  String ar[];
      Object obj[]=listManu.toArray();
      String[] stringArray=Arrays.asList(obj).toArray(new String[obj.length]);
      System.out.println("Array to String"+Arrays.toString(stringArray));
     // ar=(String[]) listManu.toArray();


     ListView lview = (ListView) findViewById(R.id.listview1);
     myAdapter adapter = new myAdapter(this, listItem, stringArray);
     lview.setAdapter(adapter);        

}

myAdapter.java

public class myAdapter extends BaseAdapter 
{
    ArrayList<String> listTitle;
    String [] data;
    ImageLoader imageLoader;


    Activity activity;

    public myAdapter(Activity activity, ArrayList<String> listTitle, String[] d) {
        super();
        this.listTitle = listTitle;
        this.data = d;


        this.activity = activity;
        this.imageLoader = new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        // TODO Auto-generated method stub
        return data.length;

    }

    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    private class ViewHolder
    {
        TextView txtViewTitle;
        ImageView image;


    }

    public View getView(int position, View view, ViewGroup parent) {
        // TODO Auto-generated method stub

        ViewHolder title;
        LayoutInflater inflater = activity.getLayoutInflater();

        if(view==null)
        {
            view = inflater.inflate(R.layout.lview_row, null);
            title = new ViewHolder();

            title.txtViewTitle = (TextView) view.findViewById(R.id.txtItem);
            title.image = (ImageView) view.findViewById(R.id.list_image);

            view.setTag(title);
        }
        else
        {
            title = (ViewHolder) view.getTag();
        }

        title.txtViewTitle.setText(listTitle.get(position));


        imageLoader.DisplayImage(data[position], title.image);

        return view;
    }
}

\

return data.length を使用している場合、画像とタイルのみを取得しています。文字列 [] はスペースではなく画像のみを保存しているため、の画像が存在します...

public int getCount() {
            return data.length;

しかし、 data.length を listTitle.size() に変更したとき

public int getCount() {
            return listTitle.size();

完全なリストを提供するため、私は listTilte.size() を使用しています...

この問題を解決し、リストビューで画像と完全なタイトルデータを取得する方法と、画像が存在する場所でタイトル付きの画像のみを取得する方法を教えてください。それ以外の場合は、タイトルのみがリストビューに表示されます...

ありがとうございます。

4

2 に答える 2

0

MyXMLHandlerのソースコードを見ずに手助けするのは簡単ではありません。XMLの解析を操作するのは非常に面倒です。データをフェッチしていますが、データを生成するサーバーも制御していますか?もしそうなら、代わりにJSONで送信することを強くお勧めします...

JSONは、簡単にマシン解析可能なjavascriptのような構文でオブジェクトを記述する方法であり、リストは次のようになります。

{"posts:":
  [ 
    {"pageId": 1, "title":"sometitle", "smallImage":"someimage.png"},
    {"pageId": 2, "title":"sometitle", "smallImage":"someimage.png"},
    {..... etc }
  ]
}

PHPでこれを作成するには、次のことを行う必要があります。

class PostsList {
  var $posts = array();
}

class Post {
 var $pageId;
 var $title;
 var $smallImage;
 function Post($pageId, $title, $smallImage) {
  $this->pageId = $pageId; $this->title = $title; $this->smallImage = $smallImage;
 }
}
$posts = new PostsList();
$posts->posts[] = new Post(1, "some title", "image.png");
$posts->posts[] = new Post(2, "some other title", "image2.png");

echo json_encode($posts);

これで、Javaで同じオブジェクトを作成します。

class PostsList { 
  public ArrayList<Post> posts; 
}
class Post { 
  public int pageId; 
  public String title; 
  public String smallImage;
}

次に、GSON(Androidで動作)を取得し、次のようにします。

Gson gson = new GsonBuilder().create();
String jsonData = getDataFromServer();
PostsList gotFromServer = gson.fromJson(jsonData, PostsList.class);

出来上がり!すべての投稿がすでにJavaオブジェクトに解析されています。また、PostsListオブジェクトをアダプタにしてlistで使用することもできます...

JSONに慣れた後、RPCでのXMLの使用をやめました。JSONデータの操作は非常に簡単で、後でフィールドを追加または削除するのも非常に簡単です...

于 2012-04-23T09:00:16.943 に答える
0

使用時に nullpointerexception が発生した場合listTitle.size();、listTitle は初期化されていません。

コードサンプルには、getter を除いて listTitle のコードが含まれていません。

于 2012-04-23T08:44:12.133 に答える