0

SAX パーサーを介して解析し、URL を介して画像を読み込み、次のアクティビティに渡して表示したいと考えています。しかし、私を助けたり、再利用可能なコードを提供してくれる人がいれば、そうすることに失敗しています。これが私のxmlファイルです。これが私の解析済みデータ クラスとアダプター クラスです。(日付、コスト、説明、画像) のようなデータを解析し、すべてを個々のタグの文字列に入れ、必要に応じて次のアクティビティに渡すことができます。また、画像に共有を実装する必要があるので、xmlからの画像のURLが必要です

PARSEDDATA クラス

public class ParseData extends DefaultHandler { boolean title , cost , pubDate , link = false;

StringBuffer stringTitle , stringCost  , stringPubdate , stringLink = null;

ArrayList<String> arrtitle = new ArrayList<String>();

ArrayList<String> arrcost = new ArrayList<String>();

ArrayList<String> arrpubDate = new ArrayList<String>();

ArrayList<String> arrlink = new ArrayList<String>();



//---------START ELEMENT----------//

@Override
public void startElement(String uri , String localName , String qName , Attributes attributes) throws SAXException 
{
    super.startElement(uri, localName, qName, attributes);

    if(localName.equalsIgnoreCase("title"))
    {
        title = true;

    }else if(localName.equalsIgnoreCase("cost"))
    {
        cost = true;

    }else if(localName.equalsIgnoreCase("pubDate"))
    {
        pubDate = true;

    }else if(localName.equalsIgnoreCase("link"))
    {
        link = true;
    }
}
//--------END ELEMENT----------//

@Override
public void endElement(String uri , String localName , String qName) throws SAXException 
{
    super.endElement(uri, localName, qName);
    if(localName.equalsIgnoreCase("title"))
    {
        title = false;

    }else if(localName.equalsIgnoreCase("cost"))
    {
        cost = false;

    }else if(localName.equalsIgnoreCase("pubDate"))
    {
        pubDate = false;

    }else if(localName.equalsIgnoreCase("link"))
        link = false;
}

@Override
public void characters(char[] ch, int start, int length)throws SAXException 
{
    super.characters(ch, start, length);


    if(title)
    {
        stringTitle = new StringBuffer("");
    title_flag = true;
    }

    if(cost)
    {
        stringCost = new StringBuffer("");
        cost_flag = true;
    }

    if(pubDate)
    {
       stringPubdate = new StringBuffer("link");
   pubDate_flag = true;
    }

    if(link)
    {
       stringLink = new StringBuffer("");
       link_flag = true;
    }
}

}

BINDADAPTER クラス

public class BindDataAdapter extends BaseAdapter {

ArrayList<String> title;

ArrayList<String> cost;

ArrayList<String> pubDate;

LayoutInflater inflater;



//---------DEFAULT CONSTRUCTOR-----------//

public BindDataAdapter()
{

}


//-------PARAMETERIZED CONSTRUCTOR------//

public BindDataAdapter(Activity activity , ArrayList<String> title , ArrayList<String> cost , ArrayList<String> pubDate)
{
    this.title = title;

    this.cost = cost;

    this.pubDate = pubDate;

    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}


@Override
public int getCount() 
{
    return title.size();
}

@Override
public Object getItem(int position) 
{
    return position;
}

@Override
public long getItemId(int position) 
{
    return position;
}

@Override
public View getView(int position , View convertView , ViewGroup parent) 
{

    if(convertView == null)
    {
        convertView = inflater.inflate(R.layout.list_row , null);
    }

    TextView textViewtitle = (TextView) convertView.findViewById(R.id.type);

    TextView textViewcost = (TextView) convertView.findViewById(R.id.cost);

    TextView textViewdate = (TextView) convertView.findViewById(R.id.date);


    //----I coudnot put text view using setText----//


    return convertView;
}

}

ここに私のMainActivityクラスがあります

public class MainActivity extends Activity {

static final String URLxml = "http://78.46.34.27/kapapps/transaction.xml";

String line = null;



@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    ListView listView = (ListView) findViewById(R.id.listview);


    try 
    {

        SAXParserFactory factory = SAXParserFactory.newInstance();

        SAXParser saxParser = factory.newSAXParser();

        XMLReader reader = saxParser.getXMLReader();

        URL sourceUrl = new URL(URLxml);

        ParseData data = new ParseData();

        reader.setContentHandler(data);

        reader.parse(new InputSource(sourceUrl.openStream()));

        BindDataAdapter bindDataAdapter = new BindDataAdapter(this , data.title , data.cost , data.pubDate);

        listView.setAdapter(bindDataAdapter);



    } catch (ParserConfigurationException e) 
    {
        e.printStackTrace();

    } catch (SAXException e) 
    {
        e.printStackTrace();

    } catch (MalformedURLException e) 
    {
        e.printStackTrace();
    } catch (IOException e) 
    {
        e.printStackTrace();
    }




}

}

4

1 に答える 1

0

コードParseDataは次のとおりです。

public class ParseData extends DefaultHandler { 

    StringBuilder elementText;
    ArrayList<String> arrtitle = new ArrayList<String>();
    ArrayList<String> arrcost = new ArrayList<String>();
    ArrayList<String> arrpubDate = new ArrayList<String>();
    ArrayList<String> arrlink = new ArrayList<String>();

    public ParseData() {
        elementText = new StringBuilder();
    }

    @Override
    public void endElement(String uri , String localName , String qName) throws SAXException {
        if ("title".equals(localName)) {
            arrtitle.add(elementText.toString().trim());
        } else if ("cost".equals(localName)) {
            arrcost.add(elementText.toString().trim());
        } else if ("pubDate".equals(localName)) {
            arrpubDate.add(elementText.toString().trim());
        } else if ("link".equals(localName)) {
            arrlink.add(elementText.toString().trim());
        }
        elementText.setLength(0);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        elementText.append(ch, start, length);
    }
}

一方、HTTP 要求と XML 解析は常に別のスレッドで行う必要があります (おそらく を使用AsyncTask)。次に、応答が解析されたら、UI を更新して結果を表示します。実行するには、多くの変更を加える必要があります。

getViewメソッドで、文字列を TextViews に設定できないのはなぜですか) ? (を利用するだけですgetItem(position)

編集

XML がそのようなものである場合、JavaBeans クラスをすべてのサブタグで明確に定義し、パーサーの結果としてそのクラスのインスタンスのリストを取得します。これは適切な方法です。

XML の各要素をモデル化する JavaBeans クラスを入力します。

public class Type {

    int id;
    String title;
    String cost;
    String date;
    String link;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getCost() {
        return cost;
    }
    public void setCost(String cost) {
        this.cost = cost;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public String getLink() {
        return link;
    }
    public void setLink(String link) {
        this.link = link;
    }
}

そして、パーサーはそのクラスのリストを作成します:

public class ParseData extends DefaultHandler { 

    StringBuilder elementText;
    List<Type> types;
    Type type;

    public ParseData() {
        types = new ArrayList<Type>();
        elementText = new StringBuilder();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if ("type".equals(localName)) {
            type = new Type();
        }
    }

    @Override
    public void endElement(String uri , String localName , String qName) throws SAXException {
        if ("title".equals(localName)) {
            type.setTitle(elementText.toString().trim());
        } else if ("cost".equals(localName)) {
            type.setCost(elementText.toString().trim());
        } else if ("pubDate".equals(localName)) {
            type.setDate(elementText.toString().trim());
        } else if ("link".equals(localName)) {
            type.setLink(elementText.toString().trim());
        } else if ("type".equals(localName)) {
            types.add(type);
        }
        elementText.setLength(0);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        elementText.append(ch, start, length);
    }
}

編集2

メソッド内で、指定された (XML から解析されたもの)からを取得するgetView()を開始する必要があります。メソッド内では、ユーティリティ メソッドを使用してビットマップを取得できます。メソッド内では、取得したビットマップをImageViewに設定するために使用できます。AsycTaskBitmapURLdoInBackgroundBitmapFactoryonPostExecutesetImageBitmapappropiate

WeakReference注: UI ウィジェットを利用するかAsyncTask、適切な場合にインスタンスをキャンセルすることで、設定変更の問題、リストのスクロールが速すぎるなどの問題を常に防止してください。

于 2013-02-04T13:34:18.963 に答える