【问题标题】:Showing text in Android ListAdapter on this specific case在此特定情况下在 Android ListAdapter 中显示文本
【发布时间】:2012-08-16 09:34:20
【问题描述】:

我正在尝试为 Android 构建一个简单的电视指南。为此,我正在使用来自一个站点的 RSS。我解析 XML,现在我想展示它。这个想法是一个列表,显示电台、当前节目和日期,当我按下列表中的某个项目时,它会给我一个新的活动,显示某个电视台的完整时间表。我已经设法将整个电视节目的各个部分分开在单独的字符串中(例如:06:00 新闻;07:15 电影)。我什至设法将它分开,以便填充 String[][](如:|06|、|00|、|News|;|07|、|15|、|Movie|)。我的想法是检查哪个最接近实时并显示它。

嗯,目前我的应用程序显示电视台、整个节目(时间表)和日期。我希望它只显示当前显示的内容。有人可以帮我解决这个问题吗?

这是我想做的类:(我还有 Parser 类和 Main 类,只有按钮和 XML 的 URL)

public class Pomocna extends ListActivity {

// All static variables
static String url =null;

// XML node keys
static final String KEY_ITEM = "item"; // parent node
static final String KEY_TITLE = "title";
static final String KEY_DATE = "pubDate";
static final String KEY_DESC = "encoded";

Calendar calendar = new GregorianCalendar();
int DSQ=calendar.get(Calendar.HOUR_OF_DAY);
int DMQ=calendar.get(Calendar.MINUTE);

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent in = getIntent();

    // Get XML values from previous intent
    url = in.getStringExtra("A");


    ArrayList<HashMap<String,String>> menuItems = new ArrayList<HashMap<String,String>>();
    //ArrayList<String[][]> nekaj = new ArrayList<String[][]>();


    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(url); //get XML
    Document doc = parser.getDomElement(xml); // get DOM elem.
    //doc.getDocumentElement().normalize();

    NodeList nl = doc.getElementsByTagName(KEY_ITEM);

    //loop
    for (int i=0; i< nl.getLength(); i++){
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);

        //add to map
        map.put(KEY_TITLE, Vracanje1(parser.getValue(e, KEY_TITLE)));
        map.put(KEY_DATE, Vracanje2(parser.getValue(e, KEY_DATE)));
        map.put(KEY_DESC, parser.getValue3(e,KEY_DESC));

        //NEKO FRCERANJE -=- POCETAK

        String pvp = parser.getValue3(e,KEY_DESC);
        char[] rast = pvp.toCharArray();
        int brojac = 0;
        for(int q=0; q<pvp.length(); q++){
            if(rast[q]=='*') brojac++;
        }

        String[][] niz= new String[brojac][3];

        int bf1=0;
        int bf3=0;

        int oo=0;
        for(int q=0; q<pvp.length(); q++){
            if(rast[q]=='*'){
                bf3=bf1;
                bf1=q;

                String lol = pvp.substring(bf3, bf1);

                // SEPARATE STRING: LOL
                // IT MUST HAVE 3 PARTS: HOUR, MINUTE, AND DESCRIPTION

                if(oo==0){
                    String ps=lol.substring(0,2);
                    String ds=lol.substring(3,5);
                    String ts=lol.substring(6,lol.length());

                    niz[oo][0]=ps;
                    niz[oo][1]=ds;
                    niz[oo][2]=ts;  
                }
                if(oo>0){
                    String ps=lol.substring(1,3);
                    String ds=lol.substring(4,6);
                    String ts=lol.substring(7,lol.length());

                    niz[oo][0]=ps;
                    niz[oo][1]=ds;
                    niz[oo][2]=ts;
                }
                oo++;
            }
        }

        //NEKO FRCERANJE -=- KRAJ

        menuItems.add(map);
        //nekaj.add(niz);
    }


    //DISPLAY WHAT's CURRENTLY ON PROGRAM
    //USE TIME TO COMPARE AND SHOW



    ListAdapter adapter = new SimpleAdapter(this, menuItems, R.layout.list_item,
            new String[]{KEY_TITLE, KEY_DESC, KEY_DATE}, new int[]{
            R.id.title, R.id.description, R.id.date
    });
    setListAdapter(adapter);

    //singleView
    ListView lv = getListView();

}

public String Vracanje1(String bq){
    int p1=bq.length();
    int p2=p1-10;
    StringBuilder sbp= new StringBuilder(bq);
    sbp.delete(p2, p1);
    String ses=sbp.toString();

    return ses;
}
public String Vracanje2(String bq){
    int p1=bq.length();
    int p2=p1-14;
    StringBuilder sbp=new StringBuilder(bq);
    sbp.delete(p2, p1);
    String ses = sbp.toString();

    return ses;
}

}

【问题讨论】:

    标签: java android arraylist hashmap listadapter


    【解决方案1】:

    根据我的理解,任何电视节目应用程序都不能接受您的做法,因为通常程序有很多频道和很多节目,并且在 UI 线程中解析和分析数据(迟早)会导致 ANR .我建议您考虑使用单独的服务和内容提供者,让 UI 线程只做与 UI 相关的事情,并将数据处理留给相应的组件。通过提供程序中的 sqlite 查找/处理数据会更快、更容易。

    关于查找最接近数据的问题 - 您可以对数组进行排序以及何时找到最接近的数据(例如,从头开始迭代)。

    【讨论】:

    • 泰。关于这个第一个答案,我不明白,你的意思是使用数据库而不是 RSS 概念还是什么? .. 我无法访问数据库,这就是我必须解析 XML 的原因。关于其他.. ty,我忘记了
    • 我的意思是使用数据库来存储解析后的数据。查看来自 google i/o - youtube.com/watch?v=xHXn3Kg2IQE 的视频,该视频对概念进行了完整的解释。
    • 是的,我考虑过使用 REST 和所有这些与服务有关的东西,但由于这就像 20-30 个程序,我认为没有必要:D .. 但是 ty
    【解决方案2】:

    我同意@sandstar,但我不确定您要问的是如何过滤数据或如何显示数据?在这种情况下,需要更新ListAdapter。这意味着,当您只想显示最近的节目时,您需要向适配器提供地图列表,其中包含仅带有最新节目数据的地图。这意味着您应该在将适配器应用到ListView 之前过滤数据。如果您想更好地控制适配器,您可以考虑扩展 ArrayAdapter,它还允许您添加/清除现有适配器的数据。

    【讨论】:

    • 是的,我问的是显示数据,具体来说,您会看到包含地图的列表。这是一个不错的功能,但我需要的是接受矩阵 (String[][]) 并显示它的列表.. 这可能吗?
    • 不。但不是在解析循环中填充“menuItems”,而是应该在那之后填充它。例如:字符串标题 = niz[lastRecentShowIndex][0];字符串日期 = niz[lastRecentShowIndex][1];字符串显示 = ...;之后: map.put(KEY_TITLE, title); map.put(KEY_DATE, 日期); map.put(KEY_DESC, 显示); menuItems.add(地图); ListAdapter 适配器 = new SimpleAdapter(this, menuItems, ....
    • 嗯,这是一个非常好的想法,但是,可能是我很笨,但我不明白如何获取 lastRecentShowIndex ...
    • 好吧,您可以遍历 niz[i][j] 并将当前时间与前一次进行比较(使用 a.compareTo(b)),然后存储它的索引(i),如果它是“比以前更大”。当您到达循环结束时,您将获得您正在寻找的索引。我认为您可以单独弄清楚实现。波兹德拉夫! ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多