0

I am trying to display empty view when no internet connection give me no internet connection and display no book when no book is not found

This is my code

public class MainActivity extends AppCompatActivity {
private static final String BOOK_REQUEST_URL = "https://www.googleapis.com/books/v1/volumes?q=";
public static final String LOG_TAG = MainActivity.class.getName();
// search button
private Button search_button;
// edit text to use for search
private EditText editText;
// string used to get string from edit text.
private String queryWord = null;
private TextView emptyTextView;
private ListView bookListView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    search_button = (Button) findViewById(R.id.next_button);
    editText = (EditText) findViewById(R.id.edit_text);
    emptyTextView = (TextView) findViewById(R.id.empty_view);

    bookListView = (ListView) findViewById(R.id.list_view);

    // Get a reference to the ConnectivityManager to check state of network connectivity
    ConnectivityManager connMgr = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);

    // Get details on the currently active default data network
    final NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

here I want when not connection give me no internet connection`

 search_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (networkInfo != null && networkInfo.isConnected()) {

                new GetBook().execute(BOOK_REQUEST_URL);
            } else {

                emptyTextView.setText(R.string.NoConnect);
                bookListView.setEmptyView(emptyTextView);

            }
        }

    });
    new GetBook().execute(BOOK_REQUEST_URL);
}
//  method to get string from edit text.
public String getBook() {
    queryWord = editText.getText().toString();
    if (queryWord == null) {
        bookListView.setEmptyView(emptyTextView);
    }
    return queryWord;
}

/**
 * Update the UI with the given book information.
 */
private void updateUi(List<Book> books) {

    // Find a reference to the {@link ListView} in the layout

    // Create a new {@link ArrayAdapter} of book
    final BookAdapter adapter = new BookAdapter(this, books);

    // Set the adapter on the {@link ListView}
    // so the list can be populated in the user interface
    bookListView.setAdapter(adapter);

}
// inner class for to support methods do in the background.
private class GetBook extends AsyncTask<String, Void, List<Book>> {

    @Override
    protected List<Book> doInBackground(String... urls) {
        String word_search = getBook();
        // Don't perform the request if there are no URLs, or the first URL is null.
        if (urls.length < 1 || urls[0] == null) {
            return null;
        }
        List<Book> result = QueryUtils.fetchBookName(urls[0], word_search);
        return result;
    }

    /**
     * This method is invoked on the main UI thread after the background work has been
     * completed.
     * <p>
     * It IS okay to modify the UI within this method. We take the {@link Book} object
     * (which was returned from the doInBackground() method) and update the views on the screen.
     */

here I want to display no list book

    @Override
        protected void onPostExecute(List<Book> book) {

            emptyTextView.setText(R.string.nobook);
            bookListView.setEmptyView(emptyTextView);

            // Hide loading indicator because the data has been loaded
            View loadingIndicator = findViewById(R.id.loading_indicator);
            loadingIndicator.setVisibility(View.GONE);
            if ((book != null) && !book.isEmpty()) {
                updateUi(book);
            }

        }
    }
}

I try more steps nothing happen

jagapathi
  • 1,635
  • 1
  • 19
  • 32

2 Answers2

2

try this

View  emptyV = getActivity().getLayoutInflater().inflate(R.layout.empty_view, null);
                    TextView tvMSG = (TextView) emptyV.findViewById(R.id.tvMSG);
                    tvMSG.setText("No product available.");
                    ViewGroup viewGroup= (ViewGroup) listView.getParent();                  
                    viewGroup.addView(emptyV, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                            ViewGroup.LayoutParams.MATCH_PARENT)); 
                    listView.setEmptyView(emptyV);  
Aniruddh Parihar
  • 3,072
  • 3
  • 21
  • 39
2

You can add another layout for empty state and pragmatically show/hide depending on list size.

Here is an example:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <RelativeLayout
        android:id="@+id/layout_empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:visibility="gone"
        android:layout_margin="30dp">

        <ImageView
            android:id="@+id/image_empty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:src="@mipmap/ic_launcher"/>

        <TextView
            android:id="@+id/text_empty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_below="@id/image_empty"
            android:layout_marginTop="16dp"
            android:gravity="center"
            android:textSize="20sp"
            android:textStyle="bold"
            android:textColor="@color/textColorPrimary"
            android:text="Oops!"/>

        <TextView
            android:id="@+id/text_empty_hints"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_below="@id/text_empty"
            android:layout_marginTop="16dp"
            android:gravity="center"
            android:textSize="14sp"
            android:textStyle="bold"
            android:textColor="@color/textColorSecondary"
            android:text="No items found"/>
    </RelativeLayout>
</RelativeLayout>

MainActivity.java:

private ListView bookListView;
private RelativeLayout layoutEmpty;

.......
............

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    bookListView = (ListView) findViewById(R.id.list_view);
    layoutEmpty = (RelativeLayout) findViewById(R.id.layout_empty);

    .......
    ...........
}

private void updateUi(List<Book> books) {

    if(books.size() > 0) {
        layoutEmpty.setVisibility(View.GONE);
        bookListView.setVisibility(View.VISIBLE);
    } else {
        layoutEmpty.setVisibility(View.VISIBLE);
        bookListView.setVisibility(View.GONE);
    }
}

OUTPUT:

enter image description here

Hope this will help~

Ferdous Ahamed
  • 21,438
  • 5
  • 52
  • 61