Android Fragment实现列表和内容联动

在平板上经常能看到这种的情况:左边是一个列表,右边是列表项对应的内容,当点击某一个列表时,右边内容区也会随之改变。下面使用Fragment简单的demo:

思路:在MainActivity定义一个回调接口,并在列表点击回调该接口,然后在内容区的Fragment设置回调,同时改变Fragment的显示内容。具体代码如下:

主布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_marginLeft="16dp"
  android:layout_marginRight="16dp"
  android:divider="?android:attr/dividerVertical"
  android:showDividers="middle">

  <ListView
    android:id="@+id/book_list"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"/>

  <FrameLayout
    android:id="@+id/book_detail_container"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="3"/>

</LinearLayout>

ListView的item布局和内容区Fragment的布局都比较简单,分别是一个Textview和两个Textview布局,这里不再贴出。

MainActivity类(内容区的数据是写死的,仅仅做演示作用,一般来说需要从网络上获取数据):

public class MainActivity extends Activity
{
  private OnChangeListener onchangedListener;
  List<Book> books;
  List<String> book_name = new ArrayList<>();
  ListView listView;
  Adapter adapter;
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    books = new ArrayList<>();
    initData();
    for (int i = 0 ; i < books.size() ; i++)
    {
      book_name.add(books.get(i).getName());
    }

    listView = (ListView) findViewById(R.id.book_list);
    adapter = new Adapter(book_name , this);
    listView.setAdapter(adapter);

    MyFragment fragment = new MyFragment();
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.book_detail_container , fragment);
    transaction.commit();

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
      @Override
      public void onItemClick(AdapterView<?> parent, View view, int position, long id)
      {
        adapter.setSelectedPosition(position);
        adapter.notifyDataSetInvalidated();

        if (onchangedListener != null)
        {
          onchangedListener.changeText(books.get(position));
        }
      }
    });
  }

  private void initData()
  {
    Book book1 = new Book();
    book1.setId(1);
    book1.setName("疯狂Java讲义");
    book1.setDesc("一本全面的,深入的Java学习图书,受到广大读者的热烈喜爱,已经被多家高校选为教材,成为国内一线的Java学习素材");
    books.add(book1);

    Book book2 = new Book();
    book2.setId(2);
    book2.setName("疯狂Android讲义");
    book2.setDesc("Android学习者的首选教材,常年占据京东,当当,亚马逊3大网店Android销量排行榜首,是人人可必备的Android入门图书");
    books.add(book2);

    Book book3 = new Book();
    book3.setId(3);
    book3.setName("Java EE企业应用实战");
    book3.setDesc("全面介绍Java EE开发的Struts2 , Spring 3 , Hibernate 4 架构,可以通过该书系统学习企业级开发,全面掌握Java学习");
    books.add(book3);

    Book book4 = new Book();
    book4.setId(4);
    book4.setName("HTML5开发");
    book4.setDesc("全面介绍HTML5,CSS ,JavaScript等知识点,通过该书可以系统的学习Web前端开发,通常Javascript脚本设置动态页面");
    books.add(book4);
  }

  public void setOnChangeListener(OnChangeListener onChangeListener)
  {
    this.onchangedListener = onChangeListener;
  }

  interface OnChangeListener
  {
    void changeText(Book book);
  }
}

列表的Adapter类:

public class Adapter extends BaseAdapter
{
  private List<String> mData;
  private LayoutInflater layoutInflater;
  private int selectionPosition = -1;
  public Adapter(List<String> data , Context context)
  {
    this.mData = data;
    this.layoutInflater = LayoutInflater.from(context);
  }

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

  @Override
  public Object getItem(int position)
  {
    return mData.get(position);
  }

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

  @Override
  public View getView(int position, View convertView, ViewGroup viewGroup)
  {
    ViewHolder viewHolder = null;
    if (convertView == null)
    {
      viewHolder = new ViewHolder();
      convertView = layoutInflater.inflate(R.layout.item_layout , null);
      viewHolder.tv = (TextView) convertView.findViewById(R.id.item_text);
      convertView.setTag(viewHolder);
    }
    else
    {
      viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.tv.setText(mData.get(position));
    if (selectionPosition == position)
    {
      viewHolder.tv.setBackgroundColor(Color.YELLOW);
    }
    else
    {
      viewHolder.tv.setBackgroundColor(Color.WHITE);
    }
    return convertView;
  }

  public void setSelectedPosition(int position)
  {
    this.selectionPosition = position;
  }

  class ViewHolder
  {
    TextView tv;
  }
}

内容区的Fragment类:

public class MyFragment extends Fragment
{
  MainActivity activity;
  private TextView title;
  private TextView desc;
  @Nullable
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    View view = inflater.inflate(R.layout.fragment_book_detail , null);
    title = (TextView) view.findViewById(R.id.book_title);
    desc = (TextView) view.findViewById(R.id.book_desc);
    Log.d("fragment" , "Created");
    activity = (MainActivity) getActivity();
    activity.setOnChangeListener(new MainActivity.OnChangeListener()
    {
      @Override
      public void changeText(Book book)
      {
        title.setText(book.getName());
        desc.setText(book.getDesc());
      }
    });
    return view;
  }
}

Book实体类:

public class Book
{
  private int id;
  private String name;
  private String desc;
  public Book()
  {
  }

  public Book(int id , String name , String desc)
  {
    this.id = id;
    this.name = name;
    this.desc = desc;
  }

  public void setName(String name) {
    this.name = name;
  }

  public void setId(int id) {
    this.id = id;
  }

  public void setDesc(String desc) {
    this.desc = desc;
  }

  public int getId() {
    return id;
  }

  public String getName() {
    return name;
  }

  public String getDesc() {
    return desc;
  }
}

效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android省市区三级联动控件使用方法实例讲解

    最近有需求需要实现省市区三级联动,但是发现之前的实现不够灵活,自己做了一些优化.为了方便以后使用,抽离出来放在了github上WheelView.同时把其核心库放在了JCenter中了,可以直接引用.也可以参考项目中的Demo进行引用 下面介绍一下如何使用 如果用的是AndroidStudio那么直接在build.gradle文件中添加依赖: dependencies { compile 'chuck.WheelItemView:library:1.0.1' } 成功引入库之后,可以在需要弹出省

  • Android仿eleme点餐页面二级联动列表

    本周末外卖点得多,就仿一仿"饿了么"好了.先上图吧,这样的订单页面是不是很眼熟: 右边的listview分好组以后,在左边的Tab页建立索引.可以直接导航,是不是很方便.关键在于右边滑动,左边也会跟着滑:而点击左边呢,也能定位右边的项.它们存在这样一种特殊的交互.像这种联动的效果,还有些常见的例子呢,比如知乎采用了常见的toolbar+viewPager的联动,只不过是上下布局: 再看看点评,它的城市选择页面也有这种联动的影子,只是稍微弱一点.侧边栏可以对listview进行索引,这最

  • Android实现三级联动下拉框 下拉列表spinner的实例代码

    主要实现办法:动态加载各级下拉值的适配器 在监听本级下拉框,当本级下拉框的选中值改变时,随之修改下级的适配器的绑定值              XML布局: 复制代码 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_w

  • Android实现底部图标与Fragment的联动实例

    本文介绍了ndroid实现底部图标与Fragment的联动,分享给大家,希望此文章对各位有所帮助. 效果如下: 1.首先在res下的drawable下新建四个图标的xml,分别把图标的选中和未选中的状态设置好,所有的图片可以放在res下新建的一个drawable-xhdpi目录下,这里仅展示一个图标的xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="ht

  • 最好用的Android省市区三级联动选择效果

    Android省市区选择三级联动效果,一个不大不小的功能,就算你做过,但是没有相关的代码直接写,也要花掉你至少半天时间. 下面我写出我的实现过程(思路绝对清晰). 先上效果图 一.准备数据 我是用的本地的json数据(走网络的话太慢,每次都要请求),放在asserts中.格式如下: [{ "name": "河北省", "city": [ { "name": "石家庄市", "area":

  • android-wheel控件实现三级联动效果

    本文实例为大家分享了android wheel省市县三级联动效果,供大家参考,具体内容如下 在github上面有一个叫做 Android-wheel 的开源控件, 代码地址:https://github.com/maarek/android-wheel 源码下载地址:http://xiazai.jb51.net/201610/yuanma/AndroidCascadeMaster(jb51.net).rar 主界面布局 activity_main.xml <LinearLayout xmlns:

  • Android中TabLayout+ViewPager实现tab和页面联动效果

    TabLayout+ViewPager实现tab和页面联动效果 xml中: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" an

  • Android中使用开源框架Citypickerview实现省市区三级联动选择

    1.概述 记得之前做商城项目,需要在地址选择中实现省市区三级联动,方便用户快速的填写地址,当时使用的是一个叫做android-wheel 的开源控件,当时感觉非常好用,唯一麻烦的是需要自己整理并解析省市区的xml文件,思路很简单,但是代码量相对大了些.偶然期间发现了另外一个开源组件,也就是今天要介绍的citypickerview. github地址:crazyandcoder/citypicker 2. 实现效果 下面给大家演示下实现效果: 3.   实现方法 (1)添加依赖 dependenc

  • Android实现两个ScrollView互相联动的同步滚动效果代码

    本文实例讲述了Android实现两个ScrollView互相联动的同步滚动效果代码.分享给大家供大家参考,具体如下: 最近在做一个项目,用到了两个ScrollView互相联动的效果,简单来说联动效果意思就是滑动其中的一个ScrollView另一个ScrollView也一同跟着滑动,要做到一起同步滑动.感觉在以后的项目开发中大家可能也会用到,绝对做个Demo分享出来,供大家一起学习,以便大家以后好用,觉的不错,有用的可以先收藏起来哦! 其实对于ScrollView,Android官方并没有提供相关

  • Android自定义WheelView地区选择三级联动

    本文实例为大家分享了WheelView地区选择三级联动的具体代码,供大家参考,具体内容如下 1. 效果 最近需要做一个地区选择的功能,但是在网上和github上找了很久都没找到满意的,然后朋友推荐了一个给我,我花了点时间把代码大致看懂并改成我想要的,并写上我的理解.效果如图: 2. 注意 a. 首先我们要明白,网上这写三级联动的demo,不管是把数据库文件放在raw还是assets中,我们都要进行复制,将这个文件复制到app目录下,即 /data/data/"+context.getPackag

随机推荐