Hello I make a simple tab view using pager and fragment . So I have two tabs in my view .In one tab I have list view in which each row have textview and favourite image button .In second Tabs I need to show all item name which is favourite in first tab .so I need to send a list from one fragment to another another list .
here is my code
Mainactivity.java
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
ViewPager viewPager;
FragmentpagerAdapter fragmentpagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ActionBar actionBar =getActionBar();
viewPager = (ViewPager) findViewById(R.id.pager);
fragmentpagerAdapter =new FragmentpagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(fragmentpagerAdapter);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.addTab(actionBar.newTab().setText("Stations").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("fav Station").setTabListener(this));
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
}
@Override
public void onPageSelected(int i) {
actionBar.setSelectedNavigationItem(i);
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
}
@Override
public void onTabSelected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {
}
@Override
public void onTabReselected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {
}
}
activity_main.xml
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pager"
>
</android.support.v4.view.ViewPager>
fragmentone.java
public class Fragmentone extends Fragment{
ArrayList<DataModel> name;
boolean isPressed=false;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
name=new ArrayList<DataModel>();
name.add(new DataModel("First Station",false));
name.add(new DataModel("Second Station",false));
ListView listView = (ListView) view.findViewById(R.id.list_view);
CustomAdapter customAdapter =new CustomAdapter(getActivity(),name);
listView.setAdapter(customAdapter);
return view;
}
}
customAdapter.java
public class CustomAdapter extends BaseAdapter implements View.OnClickListener {
private Activity activity;
private ArrayList data;
private static LayoutInflater inflater = null;
boolean isPressed=false;
public CustomAdapter(Activity a, ArrayList d) {
/********** Take passed values **********/
activity = a;
data = d;
inflater = (LayoutInflater) activity.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
if (data.size() <= 0)
return 1;
return data.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public void onClick(View v) {
}
/*********
* Create a holder Class to contain inflated xml file elements
*********/
public static class ViewHolder {
public TextView text;
public ImageButton imageButton;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View vi = convertView;
final ViewHolder holder;
if (convertView == null) {
/****** Inflate tabitem.xml file for each row ( Defined below ) *******/
vi = inflater.inflate(R.layout.row_layout, null);
/****** View Holder Object to contain tabitem.xml file elements ******/
holder = new ViewHolder();
holder.text = (TextView) vi.findViewById(R.id.station_name);
holder.imageButton = (ImageButton) vi.findViewById(R.id.favorite);
holder.imageButton.setBackgroundResource(R.drawable.off);
/************ Set holder with LayoutInflater ************/
vi.setTag(holder);
} else
holder = (ViewHolder) vi.getTag();
if (data.size() <= 0) {
holder.text.setText("No Data");
} else {
DataModel dataModel = (DataModel) data.get(position);
/************ Set Model values in Holder elements ***********/
holder.text.setText(dataModel.getText());
// this is for overall row click
vi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("row is click","row click"+position);
}
});
// this is for image button onclick
holder.imageButton.setOnClickListener(new View.OnClickListener() {
DataModel dataModel = (DataModel) data.get(position);
@Override
public void onClick(View v) {
if(dataModel.isselected()){
holder.imageButton.setBackgroundResource(R.drawable.off);
dataModel.setIsselected(false);
}else{
holder.imageButton.setBackgroundResource(R.drawable.on);
dataModel.setIsselected(true);
}
isPressed = !isPressed; // reverse
}
});
;
}
return vi;
}
}
datamodel.java
public class DataModel {
String text;
DataModel(String text, boolean isselected) {
this.text = text;
this.isselected = isselected;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public boolean isselected() {
return isselected;
}
public void setIsselected(boolean isselected) {
this.isselected = isselected;
}
boolean isselected;
}
fragmentone.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#325633"
>
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list_view">
</ListView>
</LinearLayout>
rowlayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/station_name"
android:padding="10dp"
android:textColor="#eee345"
android:textAppearance="?android:textAppearanceLarge"
/>
<ImageButton android:id="@+id/favorite"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:background="#00ffffff"
/>
</LinearLayout>
fragmenttwo.java
public class FragmentTwo extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_two, container, false);
}
}
fragmenttwo.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ee2333">
</LinearLayout>
public class FragmentpagerAdapter extends FragmentPagerAdapter {
public FragmentpagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
return new Fragmentone();
case 1:
return new FragmentTwo();
default:
break;
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
As shown in image above I select first station is my favourite station .I need to display on second tab ? can it is possible ?
There are few ways to do it.
The most basic and recommended one is define an interface in your sending Fragment, then make the container Activity implement that interface, so you can send data from your Fragment to the Activity. From that you can send data to your receiving Fragment.
Take a look at this official tutorial from Google:
http://developer.android.com/training/basics/fragments/communicating.html
Another way is using Bus event style, it's much cooler than the previous one. You can do so with Otto. Subscribe in your receiving Fragment, then just send any data you want from your sending Fragment, no need to communicate or write lengthy interfaces.
Create an interface in your fragment and implement that in your corresponding activity.
You can refer this link: https://developer.android.com/training/basics/fragments/communicating.html
Suppose you are sending data from FragmentA to FragmentB, then the best practice is to use Interfaces and then communicate between fragment via the container activity. Below is a small snippet that will provide with the skeleton of what i am trying to say:
Step-1: In your FragmentA define an Interface and override onAttach() method to make it mandatory for your container activity to implement the interface and provide body to its method.
Now, in your FragmentA you can pass value to myMethod() like:
if (listener!=null) { listener.myMethod(yourArguments); }
Step-2: Now, In your container activity implement the callback Interface
Step-3: In FragmentB have a method say for example methodInFragmentB(yourParameters)
I hope the above description helps. Thanks.