1

I'm an Android beginner and I can't figure out how to use adapters for a custom listview. What should happen is that when opening the app, the app will fetch json data from the url provided. Currrently the tab is blank but there are no errors in the logcat nor in the code. Any help would be greatly appreciated! Thanks.

Main Activity (Tabs) Code

public class Tabs extends AppCompatActivity {

private SectionsPagerAdapter mSectionsPagerAdapter;

private ViewPager mViewPager;
public static ListView list;

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

    //context errors?
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    toolbar.setNavigationIcon(R.drawable.tblogo);
    toolbar.setTitle("REMOVEDFORSECURITY);
    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);
}


@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_tabs, 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();

    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {
    public String msg = "";
    public static boolean fmsg = false;
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    public PlaceholderFragment() {
    }

    public static void gfmsg() {
        fmsg = true;
    }

    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        if (getArguments().getInt(ARG_SECTION_NUMBER) == 1) {
            View rootView = inflater.inflate(R.layout.fragment_tab1, container, false);
            return rootView;
        } else if (getArguments().getInt(ARG_SECTION_NUMBER) == 2) {
            View rootView = inflater.inflate(R.layout.fragment_tab2, container, false);
            return rootView;
        } else if (getArguments().getInt(ARG_SECTION_NUMBER) == 3) {
            new JSONTask().execute("https://URLGOESHEREREMOVEDFORSECURITY");
            return list;
        } else if (getArguments().getInt(ARG_SECTION_NUMBER) == 4) {
            View rootView = inflater.inflate(R.layout.fragment_tab4, container, false);
            TouchImageView img = (TouchImageView) rootView.findViewById(R.id.img);
            return rootView;
        } else {
            View rootView = inflater.inflate(R.layout.fragment_tabs, container, false);
            TextView textView = (TextView) rootView.findViewById(R.id.section_label);
            textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
            return rootView;
        }

    }

}

/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        return PlaceholderFragment.newInstance(position + 1);
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 4;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Home";
            case 1:
                return "Schedule";
            case 2:
                return "Updates";
            case 3:
                return "Map";
        }
        return null;
    }
}


public static class JSONTask extends AsyncTask<String, String, String> {

    static ArrayList<String> ut_array = new ArrayList<String>();
    static ArrayList<String> um_array = new ArrayList<String>();

    @Override
    protected String doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            InputStream stream = connection.getInputStream();

            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            String finalJson = buffer.toString();
            JSONObject parentObject = new JSONObject(finalJson);
            JSONArray parentArray = parentObject.getJSONArray("updates");
            StringBuffer finalBufferedData = new StringBuffer();

            for (int i = 0; i < parentArray.length() - 1; i++) {
                JSONObject finalObject = parentArray.getJSONObject(i);
                ut_array.add(finalObject.getString("title"));
                um_array.add(finalObject.getString("body"));
            }
            return "arrays loaded";

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    public static ArrayList getutarray() {
        return ut_array;
    }

    public static ArrayList getumarray() {
        return um_array;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
    }

}
}

class update {
String title;
String message;

update(String title, String message) {
    this.title = title;
    this.message = message;
}


}

class VivzAdapter extends BaseAdapter {
ArrayList<update> list;
Context context;

VivzAdapter(Context c) {
    context = c;
    list = new ArrayList<update>();
    for (int i = 0; i < Tabs.JSONTask.getutarray().size() - 1; i++) {
        list.add(new update(Tabs.JSONTask.getutarray().get(i).toString(), Tabs.JSONTask.getutarray().get(i).toString()));
    }
}

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

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

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

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row = inflater.inflate(R.layout.single_row, viewGroup, false);
    TextView title = (TextView) row.findViewById(R.id.textView6);
    TextView msg = (TextView) row.findViewById(R.id.textView7);

    update temp = list.get(i);
    title.setText(temp.title);
    msg.setText(temp.message);
    return row;
}
}

Tab 3 Fragment

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="layout.tab3">


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

Single_row.xml code

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent">


<TextView
    android:text="TextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textView6"
    android:layout_marginTop="14dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginLeft="22dp"
    android:layout_marginStart="22dp"
    android:textAppearance="@style/TextAppearance.AppCompat.Body2" />

<TextView
    android:text="TextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView6"
    android:layout_alignLeft="@+id/textView6"
    android:layout_alignStart="@+id/textView6"
    android:id="@+id/textView7"
    android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
</RelativeLayout>

Code for activity_layout.xml

<?xml version="1.0" encoding="utf-8"?>

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/appbar_padding_top"
    android:theme="@style/AppTheme.AppBarOverlay"
    android:background="@android:color/holo_orange_dark">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@android:color/holo_orange_dark"
        android:logo="@drawable/logo"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay">

    </android.support.v7.widget.Toolbar>

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabIndicatorColor="@android:color/darker_gray"
        android:background="@android:color/holo_orange_dark" />

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

 </android.support.design.widget.CoordinatorLayout>

Fragment Tab Class

package layout;
 import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import com.smhacks.smhacks.R;
import com.smhacks.smhacks.VivzAdapter;
import static com.smhacks.smhacks.R.id.container;


public class tab3 extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
public static ListView list;

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

public tab3() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment tab3.
 */
// TODO: Rename and change types and number of parameters
public static tab3 newInstance(String param1, String param2) {
    tab3 fragment = new tab3();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_tab3, container, false);
    list = (ListView) rootView.findViewById(R.id.lvk);
    list.setAdapter(new VivzAdapter());
    return list;
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

/**
 * This interface must be implemented by activities that contain this
 * fragment to allow an interaction in this fragment to be communicated
 * to the activity and potentially other fragments contained in that
 * activity.
 * <p>
 * See the Android Training lesson <a href=
 * "http://developer.android.com/training/basics/fragments/communicating.html"
 * >Communicating with Other Fragments</a> for more information.
 */
public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}
}
  • I see this layout in the code but not in your question `R.layout.activity_tabs`. – AxelH Jan 11 '17 at 07:52
  • 2
    If your ListView is in Fragment, you can't set adapter from Activity. Do it in Your Fragment which is used in ViewPager. – Akshay Bhat 'AB' Jan 11 '17 at 07:53
  • use `baseContext()`, instead of this – W4R10CK Jan 11 '17 at 07:55
  • put your listview in fragment xml – Hamidreza Sadegh Jan 11 '17 at 08:07
  • @AkshayBhat'AB' could you explain what you mean by do it in your fragment? Are you referring to the java file of the fragment? – Anthony Lam Jan 11 '17 at 08:22
  • yes, in your view pager you will be using fragment class right, in that fragment class you are inflating the xml which contains listView, so do it in that fragment class file itself. – Akshay Bhat 'AB' Jan 11 '17 at 09:26
  • @AkshayBhat'AB' I have made the adapter a public class and have moved the list view stuff into my fragment class yet when I open the tab it is blank. Could you take a look at my code? I think it has something to do with returning list but I'm not sure. – Anthony Lam Jan 11 '17 at 17:56

0 Answers0