簡體   English   中英

列表不會出現在我的應用程序中

[英]List won't come up in my App

我正在研究一個教程,以嘗試使用Android Studio。 我正在制作的App假設是在數據庫中搜索書籍,然后顯示結果列表。 但是當我運行該應用程序卻聲稱成功時,它不會打印列表。

這是我的MainActivity.java類:

    package com.example.dpolaristar.omgandroid;

    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v4.view.MenuItemCompat;
    import android.support.v7.app.ActionBarActivity;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.widget.ShareActionProvider;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;

    import com.loopj.android.http.AsyncHttpClient;
    import com.loopj.android.http.JsonHttpResponseHandler;

    import org.json.JSONObject;

    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.util.ArrayList;


    public class MainActivity extends ActionBarActivity implements     
    View.OnClickListener,
    AdapterView.OnItemClickListener  {

TextView mainTextView;
Button mainButton;
EditText mainEditText;
ListView mainListView;
JSONAdapter mJSONAdapter;
ArrayList mNameList = new ArrayList();
ShareActionProvider mShareActionProvider;
private static final String PREFS = "prefs";
private static final String PREF_NAME = "name";
SharedPreferences mSharedPreferences;
private static final String QUERY_URL = "http://openlibrary.org/search.json?q=";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 1. Access the TextView defined in layout XML
    // and then set its text
    mainTextView = (TextView) findViewById(R.id.main_textview);
    // 2. Access the Button defined in layout XML
    // and listen for it here
    mainButton = (Button) findViewById(R.id.main_button);
    mainButton.setOnClickListener(this);
    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();
        }
    });
    // 3. Access the EditText defined in layout XML
    mainEditText = (EditText) findViewById(R.id.main_edittext);
    // 4. Access the ListView
    mainListView = (ListView) findViewById(R.id.main_listview);

    // 5. Set this activity to react to list items being pressed
    mainListView.setOnItemClickListener(this);
    // 7. Greet the user, or ask for their name if new
    displayWelcome();
    // 10. Create a JSONAdapter for the ListView
    mJSONAdapter = new JSONAdapter(this, getLayoutInflater());

    // Set the ListView to use the ArrayAdapter
    mainListView.setAdapter(mJSONAdapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu.
    // Adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);

    // Access the Share Item defined in menu XML
    MenuItem shareItem = menu.findItem(R.id.menu_item_share);

    // Access the object responsible for
    // putting together the sharing submenu
    if (shareItem != null) {
        mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
    }

    // Create an Intent to share your content
    setShareIntent();

    return true;
}
private void setShareIntent() {

    if (mShareActionProvider != null) {

        // create an Intent with the contents of the TextView
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("text/plain");
        shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Android Development");
        shareIntent.putExtra(Intent.EXTRA_TEXT, mainTextView.getText());

        // Make sure the provider knows
        // it should work with that Intent
        mShareActionProvider.setShareIntent(shareIntent);
    }
}

@Override
public void onClick(View v) {
    // 9. Take what was typed into the EditText and use in search
    queryBooks(mainEditText.getText().toString());
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


}

public void displayWelcome() {

    // Access the device's key-value storage
    mSharedPreferences = getSharedPreferences(PREFS, MODE_PRIVATE);

    // Read the user's name,
    // or an empty string if nothing found
    String name = mSharedPreferences.getString(PREF_NAME, "");

    if (name.length() > 0) {

        // If the name is valid, display a Toast welcoming them
        Toast.makeText(this, "Welcome back, " + name + "!", Toast.LENGTH_LONG).show();
    } else {

        // otherwise, show a dialog to ask for their name
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Hello!");
        alert.setMessage("What is your name?");

        // Create EditText for entry
        final EditText input = new EditText(this);
        alert.setView(input);

        // Make an "OK" button to save the name
        alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int whichButton) {

                // Grab the EditText's input
                String inputName = input.getText().toString();

                // Put it into memory (don't forget to commit!)
                SharedPreferences.Editor e = mSharedPreferences.edit();
                e.putString(PREF_NAME, inputName);
                e.commit();

                // Welcome the new user
                Toast.makeText(getApplicationContext(), "Welcome, " + inputName + "!", Toast.LENGTH_LONG).show();
            }
        });

        // Make a "Cancel" button
        // that simply dismisses the alert
        alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int whichButton) {}
        });

        alert.show();
    }
    }
private void queryBooks(String searchString) {

    // Prepare your search string to be put in a URL
    // It might have reserved characters or something
    String urlString = "";
    try {
        urlString = URLEncoder.encode(searchString, "UTF-8");
    } catch (UnsupportedEncodingException e) {

        // if this fails for some reason, let the user know why
        e.printStackTrace();
        Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
    }

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

    // Have the client get a JSONArray of data
    // and define how to respond
    client.get(QUERY_URL + urlString,
            new JsonHttpResponseHandler() {

                @Override
                public void onSuccess(JSONObject jsonObject) {
                    // Display a "Toast" message
                    // to announce your success
                    Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show();

                    // update the data in your custom method.
                    mJSONAdapter.updateData(jsonObject.optJSONArray("docs"));
                }

                @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("omg android", statusCode + " " + throwable.getMessage());
                }
            });
}
}

這是我的另一個類JSONAdapter.java:

    package com.example.dpolaristar.omgandroid;

    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;

    import com.squareup.picasso.Picasso;

    import org.json.JSONArray;
    import org.json.JSONObject;

    /**
    * Created by dpolaristar on 1/11/2016.
    */
    public class JSONAdapter extends BaseAdapter {
    private static final String IMAGE_URL_BASE =  
    "http://covers.openlibrary.org/b/id/";

    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) {
    // your particular dataset uses String IDs
    // but you have to put something in this method
    return position;
}

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

    // check if the view already exists
    // if so, no need to inflate and findViewById again!
    if (convertView == null) {

        // Inflate the custom row layout from your XML.
        convertView = mInflater.inflate(R.layout.row_book, null);

        // create a new "Holder" with subviews
        holder = new ViewHolder();
        holder.thumbnailImageView = (ImageView) convertView.findViewById(R.id.img_thumbnail);
        holder.titleTextView = (TextView) convertView.findViewById(R.id.text_title);
        holder.authorTextView = (TextView) convertView.findViewById(R.id.text_author);

        // hang onto this holder for future recyclage
        convertView.setTag(holder);
    } else {

        // skip all the expensive inflation/findViewById
        // and just get the holder you already made
        holder = (ViewHolder) convertView.getTag();
    }
    // More code after this
    // Get the current book's data in JSON form
    JSONObject jsonObject = (JSONObject) getItem(position);

    // See if there is a cover ID in the Object
    if (jsonObject.has("cover_i")) {

        // If so, grab the Cover ID out from the object
        String imageID = jsonObject.optString("cover_i");

        // Construct the image URL (specific to API)
        String imageURL = IMAGE_URL_BASE + imageID + "-L.jpg";

        // Use Picasso to load the image
        // Temporarily have a placeholder in case it's slow to load
        Picasso.with(mContext).load(imageURL).placeholder(R.drawable.ic_books).into(holder.thumbnailImageView);
    } else {

        // If there is no cover ID in the object, use a placeholder
        holder.thumbnailImageView.setImageResource(R.drawable.ic_books);
    }
    // Grab the title and author from the JSON
    String bookTitle = "";
    String authorName = "";

    if (jsonObject.has("title")) {
        bookTitle = jsonObject.optString("title");
    }

    if (jsonObject.has("author_name")) {
        authorName = jsonObject.optJSONArray("author_name").optString(0);
    }

    // Send these Strings to the TextViews for display
    holder.titleTextView.setText(bookTitle);
    holder.authorTextView.setText(authorName);

    return convertView;
}
public void updateData(JSONArray jsonArray) {
    // update the adapter's dataset
    mJsonArray = jsonArray;
    notifyDataSetChanged();
}
// this is used so you only ever have to do
// inflation and finding by ID once ever per View
private static class ViewHolder {
    public ImageView thumbnailImageView;
    public TextView titleTextView;
    public TextView authorTextView;
}
}

如果您需要查看其他任何代碼或需要回答其他問題,我將為您提供。

如果他們做錯了什么,或者如果您想檢查我是否錯過了某個步驟,這是我可以參考的教程。 (盡管我已經檢查過了。)

http://www.raywenderlich.com/78578/android-tutorial-for-beginners-part-3

修改以下代碼:

            @Override
            public void onSuccess(JSONObject jsonObject) {
                // Display a "Toast" message
                // to announce your success
                Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show();

                // update the data in your custom method.
                mJSONAdapter.updateData(jsonObject.optJSONArray("docs"));
            }

至:

@Override
public void onSuccess(JSONObject jsonObject) {
    final JSONObject finalJsonObject = jsonObject;
    // Display a "Toast" message
    // to announce your success
    Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show();

    // update the data in your custom method.
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            mJSONAdapter.updateData(finalJsonObject.optJSONArray("docs"));
        }
    });
}

您還需要更改

JSONAdapter mJSONAdapter;

至:

final JSONAdapter mJSONAdapter;

在onCreate中切換以下兩個:

// 7. Greet the user, or ask for their name if new
displayWelcome();
// 10. Create a JSONAdapter for the ListView
mJSONAdapter = new JSONAdapter(this, getLayoutInflater());

因此,它們變為:

// 7. Greet the user, or ask for their name if new
mJSONAdapter = new JSONAdapter(this, getLayoutInflater());
// 10. Create a JSONAdapter for the ListView
displayWelcome();

將這些行放在queryBooks() => onSuccess()

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM