【问题标题】:Android Studio Custom Listview need to be displayed on fragmentAndroid Studio 自定义 Listview 需要在 Fragment 上显示
【发布时间】:2016-03-31 15:28:15
【问题描述】:

目前我正在尝试为我的应用程序创建一个自定义列表视图,我已经成功了。但我遇到的问题是,如果我将列表视图放在我的主要活动上,那么列表视图会按计划工作,同时显示文本和图像。但是对于我的应用程序,我可以在页面之间滑动,而不是在我的主要活动页面上永久拥有这个列表视图,我希望它在片段页面上,例如WineList 页面,当用户滑动到下一页时,您可以知道更长的看到它

如果我尝试将列表视图更改为片段页面上的列表视图,则会收到一个空异常错误,这是可以理解的,因为我猜在用户滑动之前该页面尚未创建。

我添加了下面的图片来说明我的意思。

Listview on Main Activity

我的应用程序设置

自定义适配器类 --

class CustomAdapter extends ArrayAdapter<String> {


public CustomAdapter(Context context, String[] names) {
    super(context, R.layout.custom_row, names);
}

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

    LayoutInflater hadleighsInflater = LayoutInflater.from(getContext());
    View customView = hadleighsInflater.inflate(R.layout.custom_row, parent, false);

    String singleName = getItem(position);
    TextView hadleighText = (TextView) customView.findViewById(R.id.hadleighText);
    ImageView hadleighImage = (ImageView) customView.findViewById(R.id.myimageView);

    hadleighText.setText(singleName);
    hadleighImage.setImageResource(R.drawable.imageresize);
    return  customView;




}
}

主要活动 --

   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainwindow);





    viewPager = (ViewPager)findViewById(R.id.swipeView);
    viewPager.setAdapter(new CustomAdapter(getSupportFragmentManager(), getApplicationContext()));

  //  Currently set up to the list view on the main activity


    String[] names = {"Hadleigh", "james", "LOLLLO"};
    ListAdapter hadleighsAdapter = new socialdeveloper.adgestonevineyard.CustomAdapter(this,names);
    ListView hadleighsListView = (ListView)findViewById(R.id.myListview);
    hadleighsListView.setAdapter(hadleighsAdapter);


    tabLayout = (TabLayout) findViewById(R.id.tabSwipe);
    tabLayout.setupWithViewPager(viewPager);

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());

        }

WineList 片段(我希望在其上显示我的列表视图)-----

public class WineList extends Fragment{




@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.winelist, container, false);


}



}

所以基本上它目前在主要活动上,但我不知道我必须实施哪些更改才能将其显示在片段页面上。

Example of what I'm trying to achieve

【问题讨论】:

  • 如果这是您的 Fragment -> WineList 您想在其中显示您的列表视图,然后只需在其中添加 ListView 即可!也通过膨胀创建视图对象,然后返回它
  • 我可以在酒单 XML 中添加一个列表视图,然后将其直接添加到主要活动类中。你能举一个我如何编辑我的代码的例子吗?
  • 由于某种原因无法在本网站上回答

标签: android listview android-fragments android-studio


【解决方案1】:

如果您想在您的ViewPager 中显示Fragment,请使用FragmentStatePagerAdapter
使用ListView 为您的Fragment 创建布局。
使用一些参数为 Fragment 的新实例创建静态方法。使用此参数,您可以将具有不同值的适配器设置为当前Fragment 中的ListView


如果对您来说太复杂,请关注tutorial
只需将ImageView 替换为ListView 并实现上述想法即可。

【讨论】:

    【解决方案2】:

    您也可以使用这个完整的代码!它适用于我在您的示例图片中看到的内容。

    首先,将此添加到 build.gradle

        compile 'com.android.support:appcompat-v7:23.1.1'
        compile 'com.android.support:design:23.1.1'
        compile 'com.android.support:support-annotations:23.1.1'
    

    WineListActivity

        //imports
        import android.os.Bundle;
        import android.support.design.widget.TabLayout;
        import android.support.v4.app.Fragment;
        import android.support.v4.app.FragmentManager;
        import android.support.v4.app.FragmentPagerAdapter;
        import android.support.v4.view.ViewPager;
        import android.support.v7.app.AppCompatActivity;
        import java.util.ArrayList;
        import java.util.List;
    
    
        public class WineListActivity extends AppCompatActivity {
    
            ViewPager viewPager;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_winelist);
    
                viewPager = (ViewPager) findViewById(R.id.viewpager);
                if (viewPager != null) {
                    setupViewPager(viewPager);
                    viewPager.setOffscreenPageLimit(3);
                }
    
                TabLayout tabLayout = (TabLayout) findViewById(R.id.viewpager);
                tabLayout.setupWithViewPager(viewPager);
    
    
            }
    
    
            private void setupViewPager(ViewPager viewPager) {
                Adapter adapter = new Adapter(getSupportFragmentManager());
                adapter.addFragment(new InformationFragment(), "INFORMATION");
                adapter.addFragment(new HomeWebsitesFragment(), "LISTVIEW");
                adapter.addFragment(new HomeFragment(), "HOME");
                viewPager.setAdapter(adapter);
            }
    
    
            static class Adapter extends FragmentPagerAdapter {
                private final List<Fragment> mFragments = new ArrayList<>();
                private final List<String> mFragmentTitles = new ArrayList<>();
    
                public Adapter(FragmentManager fm) {
                    super(fm);
                }
    
                public void addFragment(Fragment fragment, String title) {
                    mFragments.add(fragment);
                    mFragmentTitles.add(title);
                }
    
                @Override
                public Fragment getItem(int position) {
                    return mFragments.get(position);
                }
    
                @Override
                public int getCount() {
                    return mFragments.size();
                }
    
                @Override
                public CharSequence getPageTitle(int position) {
                    return mFragmentTitles.get(position);
                }
            }
    }
    

    Xml 布局,activity_winelist

        <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#bdc3c7"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    
    
    </LinearLayout>
    

    您的列表片段,ListFragment

    public class ListFragment extends Fragment {
    
        public static final String ARG_PAGE = "ARG_PAGE";
        private int mPage;
    
        public static ListFragment newInstance(int page) {
            Bundle args = new Bundle();
            args.putInt(ARG_PAGE, page);
            ListFragment fragment = new ListFragment();
            fragment.setArguments(args);
            return fragment;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
    
            ListView listview = (ListView) findViewById(R.id.listview);
            String[] values = new String[] { "wine 1", "wine 2", "wine 3",
                   "wine 4" };
    
            ArrayList<String> list = new ArrayList<String>();
           for (int i = 0; i < values.length; ++i) {
               list.add(values[i]);
           }
    
            MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(this, list);
            if(list.size() == 0){
                listview.setEmptyView(findViewById(R.id.emptyview));
            }
            listview.setAdapter(adapter);
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
    
            View view = inflater.inflate(R.layout.fragment_list, container, false);
            return view;
        }
    
    }
    

    你的列表,list.xml

     <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="?android:attr/listPreferredItemHeight"
            android:padding="6dip" >
    
            <TextView
                android:id="@+id/label"
                android:layout_width="fill_parent"
                android:layout_height="26dip"
                android:ellipsize="marquee"
                android:singleLine="true"
                android:text="Description"
                android:textSize="12sp" />
    
    
        </RelativeLayout>
    

    您的适配器,MySimpleArrayAdapter

        public class MySimpleArrayAdapter extends ArrayAdapter<String> {
    
            private final Context context;
            private final List<String> values;
    
    
                public MySimpleArrayAdapter(Context context, List<String> values) {
                    super(context, -1, values);
                    this.context = context;
                    this.values = values;
                }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View rowView = inflater.inflate(R.layout.list, parent, false);
                TextView textView = (TextView) rowView.findViewById(R.id.label);
                textView.setText(values.get(position));
    
                return rowView;
            }
    
        }
    

    然后你可以添加你的另外两个 Fragment 并用它们做任何你想做的事情。

    HomeFragment

        public class HomeFragment extends Fragment {
    
            public static final String ARG_PAGE = "ARG_PAGE";
            private int mPage;
    
            public static HomeFragment newInstance(int page) {
                Bundle args = new Bundle();
                args.putInt(ARG_PAGE, page);
                HomeFragment fragment = new HomeFragment();
                fragment.setArguments(args);
                return fragment;
            }
    
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                //mPage = getArguments().getInt(ARG_PAGE);
            }
    
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
    
                View view = inflater.inflate(R.layout.fragment_home, container, false);
                return view;
            }
    
        }
    

    信息片段

        public class InformationFragment extends Fragment {
    
            public static final String ARG_PAGE = "ARG_PAGE";
            private int mPage;
    
            public static InformationFragment newInstance(int page) {
                Bundle args = new Bundle();
                args.putInt(ARG_PAGE, page);
                InformationFragment fragment = new InformationFragment();
                fragment.setArguments(args);
                return fragment;
            }
    
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                //mPage = getArguments().getInt(ARG_PAGE);
            }
    
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
    
                View view = inflater.inflate(R.layout.fragment_information, container, false);
                return view;
            }
    
        }
    

    【讨论】:

    • Hello Html Tosin 它非常有帮助,目前我正在尝试将所有内容放在一起时出现错误。你能把你的android文件发给我吗?我还是个初学者:D
    • 好的,我将编辑我的代码以使其更容易,您遇到了哪些错误?
    • 我主要是在构建片段页面时遇到错误,因为它无法识别 findViewById 部分。从上午 11 点到现在的 17.32
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多