2016-05-03 5 views
0

Ich weiß, dass diese Frage 100 Mal gestellt wird, aber aus irgendeinem Grund kann ich nicht finden, was in meinem Code falsch ist. Ich bin sehr neu in Android und Java. Grundsätzlich habe ich eine Wordpress-Website, von der ich die Artikel bekommen möchte. Ich habe die wp-rest-api v2 installiert, um die Daten im JSON-Array-Format zu erhalten. In meiner android app habe ichPoping Listenansicht von JSON

MainActivity.java

package al.im.imp; 
/*ALL THE IMPORTS*/ 

public class ImpHome extends AppCompatActivity implements View.OnClickListener { 

ListView lstTest; 
JSONAdapter mJSONAdapter; 
Button search_Button; 

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

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 


     //Access Listview 
     lstTest = (ListView) findViewById(R.id.home_list); 




     search_Button = (Button) findViewById(R.id.button1); 
     search_Button.setOnClickListener(this); 


     mJSONAdapter = new JSONAdapter(this, getLayoutInflater()); 
     lstTest.setAdapter(mJSONAdapter); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_impakt_home, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 


    private void queryImp() { 

     // Create a client to perform networking 
     AsyncHttpClient client = new AsyncHttpClient(); 

     client.get("http://example.com/wp-json/wp/v2/posts", 


       new JsonHttpResponseHandler() { 

        @Override 
        public void onSuccess(JSONArray jsonArray) { 
         Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show(); 

         mJSONAdapter.updateData(jsonArray); 
        } 

        @Override 
        public void onFailure(int statusCode, Throwable throwable, JSONObject error) { 
         // Display a "Toast" message 
         // to announce the failure 
         Toast.makeText(getApplicationContext(), "Error: " + statusCode + " " + throwable.getMessage(), Toast.LENGTH_LONG).show(); 

         // Log error message 
         // to help solve any problems 
         Log.e("Imp android", statusCode + " " + throwable.getMessage()); 
        } 
       }); 

    } 


    @Override 
    public void onClick(View v) { 
     queryImp(); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 


    } 

    @Override 
    public void onStop() { 
     super.onStop(); 

    } 
} 

Mein article_list.xml Layout

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="75dp"> 

    <TextView 
     android:id="@+id/text_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="25dp"/> 


</RelativeLayout> 

und meine JSONAdapter.java Klasse

package al.imp.imp; 

/*IMPORTS*/ 

public class JSONAdapter extends BaseAdapter{ 

    Context mContext; 
    LayoutInflater mInflater; 
    JSONArray mJsonArray; 

    public JSONAdapter(Context context, LayoutInflater inflater) { 
     mContext = context; 
     mInflater = inflater; 
     mJsonArray = new JSONArray(); 
    } 

    @Override 
    public int getCount() { 
     return mJsonArray.length(); 
    } 

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

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

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

     if (convertView == null) { 

      convertView = mInflater.inflate(R.layout.article_list, null); 

      holder = new ViewHolder(); 
      holder.titleTextView = (TextView) convertView.findViewById(R.id.text_title); 

      convertView.setTag(holder); 
     } else { 

      holder = (ViewHolder) convertView.getTag(); 
     } 

     JSONObject jsonObject = (JSONObject) getItem(position); 

     String articleTitle = ""; 

      articleTitle = jsonObject.optJSONObject("title").optString("rendered"); 

     holder.titleTextView.setText(articleTitle); 

     return convertView; 
    } 

    private static class ViewHolder { 

     public TextView titleTextView; 

    } 


    public void updateData(JSONArray jsonArray) { 
     // update the adapter's dataset 
     mJsonArray = jsonArray; 
     notifyDataSetChanged(); 
    } 

} 

Ich weiß nicht, warum Das funktioniert nicht. Wenn ich versuche, die Daten zu protokollieren wie

for (int i = 1; i < jsonArray.length(); i++) { 
     Log.d("Title is:", jsonArray.optJSONObject(i).getJSONObject("title").getString("rendered").toString()); 
     Log.d("Image Url is:", jsonArray.optJSONObject(i).getString("featured_image_thumbnail_url").toString()); 
} 

es funktioniert perfekt, also denke ich, es in immer die Json Antwort kein Problem, aber die Listenansicht bevölkert.

private void queryImp() { 
// Create a client to perform networking 
    AsyncHttpClient client = new AsyncHttpClient(); 
    client.get("http://example.com/wp-json/wp/v2/posts", 
     new JsonHttpResponseHandler() { 
        @Override 
        public void onSuccess(JSONArray jsonArray) { 
         Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show(); 

         mJSONAdapter.updateData(jsonArray); 
         mJSONAdapter.notifyDataSetChanged(); 
         //try refreshing the list-view like this: 
         lstTest.invalidateViews() 
        } 

        @Override 
        public void onFailure(int statusCode, Throwable throwable, JSONObject error) { 
         // Display a "Toast" message 
         // to announce the failure 
         Toast.makeText(getApplicationContext(), "Error: " + statusCode + " " + throwable.getMessage(), Toast.LENGTH_LONG).show(); 

         // Log error message 
         // to help solve any problems 
         Log.e("Imp android", statusCode + " " + throwable.getMessage()); 
        } 
       }); 

    } 

Lassen Sie mich helfen, wenn die Änderungen wissen: -

Helfen Sie mir bitte

+0

Versuchen Sie 'convertView = mInflater.inflate (R.layout.article_list, parent, false);', ändern Sie das und sagen Sie mir –

+0

Nichts ändert sich – ddnice

Antwort

0

Anschluss an die Aktualisierung, etwas versuchen, wie die Listenansicht wie lstTest.invalidateViews(); erfrischend so Ihre queryImp() Code wird in verändern.

+0

Nein, nichts ändert sich. Ich verstehe nicht, was los ist – ddnice

+0

Können Sie bitte entfernen Sie den 'notifyDataSetChanged(); 'Aufruf aus dem Adapter und rufen Sie nach dem Hinzufügen der Daten in der Methode' queryImp() '. Also machst du so etwas: 'mJSONAdapter.updateData (jsonArray); 'und dann' mJSONAdapter.notifyDataSetChanged(); '- lassen Sie mich wissen, ob dies hilft. – ishmaelMakitla

+0

THANXXXXXXX viel ... es hat funktioniert ... aber können Sie erklären, warum – ddnice

Verwandte Themen