2016-07-24 16 views
0

Ich bin ein Anfänger bei Android/Java. Grundsätzlich möchte ich meine XML-Daten in einem ListView anzeigen, aber wenn ich die App starte, wird das ListView überhaupt nicht angezeigt. Ich schätze, ich muss etwas falsch gemacht haben für die ListView, aber ich kann einfach nicht herausfinden, was. Also hier ist mein QuellcodeListView wird nicht angezeigt - Leerer Bildschirm

Ich weiß, dass mein Code ein wenig und unorganisiert ist. Ich arbeite daran.

content_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
app:layout_behavior="@string/appbar_scrolling_view_behavior" 
tools:context="com.example.azrie.dummyvoice.MainActivity" 
tools:showIn="@layout/app_bar_main"> 

<ListView 
    android:id="@+id/list_item" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

</ListView> 

</RelativeLayout> 

activity_listview.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:weightSum="1"> 

<TextView 
android:gravity="center" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:textAppearance="?android:attr/textAppearanceLarge" 
android:text="Large Text" 
android:id="@+id/title_text" 
android:layout_weight="0.09" /> 

<TextView 
android:layout_width="80dp" 
android:layout_height="wrap_content" 
android:textAppearance="?android:attr/textAppearanceSmall" 
android:text="Small Text" 
android:id="@+id/date_text" 
android:layout_gravity="right" 
android:layout_weight="0.05" /> 
</LinearLayout> 

MainActivity.java (onCreate)

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 


    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 



    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 

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


    //new ReadRSS(this,"http://www.thestar.com.my/rss/editors-choice/main/").execute(); 
    //new ReadRSS(this,"http://www.sciencemag.org/rss/news_current.xml").execute(); 
    //new ReadRSS(this,"https://www.androidpit.com/feed/main.xml").execute(); 
    new ReadRSS(this, listView, "http://malaysiakini.com/en/news.rss").execute(); 



} 

ReadRSS.java

public class ReadRSS extends AsyncTask<Void, Void, Void> { 

//Initialize progress dialog 
Context context; 
String address; 
ProgressDialog progressDialog; 
XmlPullParserFactory xmlPullParserFactory; 
volatile boolean parsingComplete = true; 
ArrayList<FeedItem> feedItems = new ArrayList<>(); 
ListView listView; 

public ReadRSS(Context context, ListView listView, String retrieveAddress) { 
    //Create a new progress dialog 
    this.listView = listView; 
    this.address = retrieveAddress; 
    this.context = context; 
    progressDialog = new ProgressDialog(context); 
    progressDialog.setMessage("Loading...."); 
} 

// Runs in UI before background thread is called 
@Override 
protected void onPreExecute() { 
    //Display progress dialog 
    progressDialog.show(); 
    super.onPreExecute(); 
} 

// This is run in a background thread 
@Override 
protected Void doInBackground(Void... voids) { 
    fetchXML(); 
    return null; 
} 

// This is called from background thread but runs in UI 
@Override 
protected void onProgressUpdate(Void... values) { 
    super.onProgressUpdate(values); 
} 

// This runs in UI when background thread finishes 
@Override 
protected void onPostExecute(Void aVoid) { 
    //Dismiss progress dialog 
    super.onPostExecute(aVoid); 
    progressDialog.dismiss(); if(listView!=null) { 
     MyAdapter adapter = new MyAdapter(context,feedItems); 
     listView.setAdapter(adapter); 
    } 

} 

public void parseXMLAndStoreIt(XmlPullParser myParser) { 
    int event; 
    String text=null; 

    try { 
     event = myParser.getEventType(); 
     FeedItem item = new FeedItem(); 

     while (event != XmlPullParser.END_DOCUMENT) { 
      String tagName = myParser.getName(); 

      switch (event){ 

       case XmlPullParser.START_TAG: 
        if(tagName.equalsIgnoreCase("item")){ 
         int eventChild = myParser.next(); 

          while(eventChild != XmlPullParser.END_DOCUMENT){ 
           String tagNameChild = myParser.getName(); 

           switch (eventChild){ 

            case XmlPullParser.START_TAG: 
             break; 

            case XmlPullParser.TEXT: 
             text = myParser.getText(); 
             break; 

            case XmlPullParser.END_TAG: 

             if(tagNameChild.equalsIgnoreCase("title")){ 
              item.setTitle(text); 

             } 

             else if(tagNameChild.equalsIgnoreCase("link")){ 
              item.setLink(text); 
             } 

             else if(tagNameChild.equalsIgnoreCase("description")){ 

              String plain = Html.fromHtml(text).toString(); 
              //stripHtml(text); 
              item.setDescription(plain);item.getDescription()); 
             } 

             else if(tagNameChild.equalsIgnoreCase("pubDate")){ 
              item.setPubDate(text); //Log.d("pudDate",text); 
             } 

             else if(tagNameChild.equalsIgnoreCase("media:thumbnail") || tagNameChild.equalsIgnoreCase("media:content") || tagName.equalsIgnoreCase("enclosure")){ 


              if(myParser.getAttributeValue(null,"url") != null) { 
               item.setThumbnailUrl(text);item.getThumbnailUrl()); 
               //Log.d("ItemThumbnailUrl",myParser.getAttributeValue(null,"url")); 
              } 
             } 

             else if(tagNameChild.equalsIgnoreCase("item")){ 


             } 


             break; 



           } 
          } 
        } 
        break; 

       case XmlPullParser.TEXT: 
        break; 

       case XmlPullParser.END_TAG: 
        break; 

      } 

      event = myParser.next(); 

     } 

     parsingComplete = false; 
    } 

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

public void fetchXML(){ 
    Thread thread = new Thread(new Runnable(){ 
     @Override 
     public void run() { 

      try { 
       URL url = new URL(address); 
       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

       conn.setReadTimeout(10000); 
       conn.setConnectTimeout(15000); 
       conn.setRequestMethod("GET"); 
       conn.setDoInput(true); 

       // Starts the query 
       conn.connect(); 
       InputStream stream = conn.getInputStream(); 

       xmlPullParserFactory = XmlPullParserFactory.newInstance(); 
       XmlPullParser myparser = xmlPullParserFactory.newPullParser(); 

       myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
       myparser.setInput(stream, null); 

       parseXMLAndStoreIt(myparser); 
       stream.close(); 
      } 

      catch (Exception e) { 
      } 
     } 
    }); 
    thread.start(); 
} 



} 

MyAdapter.java

public class MyAdapter extends BaseAdapter { 

Context context; 
ArrayList<FeedItem> feedItems; 
LayoutInflater inflater = null; 

public MyAdapter(Context context, ArrayList<FeedItem> feedItems){ 
    this.context = context; 
    this.feedItems = feedItems; 
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 

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

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

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

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 

    ViewHolder viewHolder; 

    if (view == null) { 

     viewHolder = new ViewHolder(); 
     view = inflater.inflate(R.layout.activity_listview, viewGroup, false); 

     viewHolder.text_title = (TextView) view.findViewById(R.id.title_text); 
     viewHolder.text_date = (TextView) view.findViewById(R.id.date_text); 

     view.setTag(viewHolder); 

    } 

    else{ 

     viewHolder = (ViewHolder) view.getTag(); 

    } 

    FeedItem objFeed = feedItems.get(i); 
    viewHolder.text_title.setText(objFeed.getTitle()); 
    viewHolder.text_date.setText(objFeed.getPubDate()); 

    return view; 
} 

static class ViewHolder{ 

    TextView text_title; 
    TextView text_date; 

} 



} 
+0

ListView ist leer, weil Sie irgendeinen Adapter darauf gesetzt haben .. via listView.setAdapter() – W0rmH0le

+0

Erster Fehler: Sie haben 'weightsum = 1' in' activity_listview.xml' definiert und die tatsächliche Summe seiner Kinder beträgt '0,09 + 0,05 = 0,14 ', was ungleich "1" ist. – Apurva

Antwort

2

Könnten Sie bitte den Code unten versuchen?

@Override 
protected void onPostExecute(Void aVoid) { 
    //Dismiss progress dialog 
    super.onPostExecute(aVoid); 
    progressDialog.dismiss(); 

    // ADD LINES BELOW 
    if(listView != null) { 
     MyAdapter adapter = new MyAdapter(context,android.R.layout.simple_list_item_1,feedItems); 
     listView.setAdapter(adapter); 
    }  
} 

Ihre ListView Ansicht nicht angezeigt wird, weil Sie keinen Adapter, um es festgelegt haben. Auf diese Weise hat die ListView keine Elemente angezeigt werden.

+0

Hallo und vielen Dank für Ihre Antwort. Nach dem Bearbeiten meines Codes ist das Ergebnis immer noch dasselbe. Ich erhalte immer noch einen leeren weißen Bildschirm. –

+0

Fügen Sie ein Protokoll bei getCount() und getView() ... hinzu, um zu bestätigen, ob Ihrem Adapter die richtigen Elemente hinzugefügt wurden ... – W0rmH0le

Verwandte Themen