为片段制作自定义列表视图?
Posted
技术标签:
【中文标题】为片段制作自定义列表视图?【英文标题】:Make a custom listView for fragments? 【发布时间】:2013-06-26 20:34:01 【问题描述】:我尝试构建一个有 4 个标签的应用。每个选项卡都有一个不同的片段链接到它。问题是我想为每个片段制作一个自定义 listView,但它以一些无法解决的错误结束......我已经与其他开发人员交谈过,但我仍然无法制作一个有效的!真的很郁闷!
我有:
一个有效的 MainActivity 类,它使用可滑动的标签 在我的自定义 ListView 上具有我想要的设计的 XML。 带有 ListView 的名为 fragment1 的 XML。这些是我得到的正常错误:
“Fragment1UG 类型的 findViewById(int) 方法未定义” “Fragment1UG 类型的方法 setContentView(int) 未定义。提供 1 个快速修复:创建方法 'setContentView()'”我试图理解和使用的指南之一:
android ListView Tutorial Android ListFragment Tutorial这是我的第一个片段:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
public class Fragment1test extends Fragment
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
// Inflate the layout for this fragment
//This layout contains your list view
View view = inflater.inflate(R.layout.fragment1, container, false);
//now you must initialize your list view
ListView yourListView = (ListView)view.findViewById(R.id.ListView1);
ListView.setAdapter(new ListAdapter());
return view;
我的 ListAdapter.java 代码(来自教程):
import java.util.List;
import android.content.ClipData.Item;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class ListAdapter extends ArrayAdapter<Item>
public ListAdapter(Context context, int textViewResourceId)
super(context, textViewResourceId);
// TODO Auto-generated constructor stub
private List<Item> items;
public ListAdapter(Context context, int resource, List<Item> items)
super(context, resource, items);
this.items = items;
@Override
public View getView(int position, View convertView, ViewGroup parent)
View v = convertView;
if (v == null)
LayoutInflater vi;
vi = LayoutInflater.from(getContext());
v = vi.inflate(R.layout.list_design, null);
Item p = items.get(position);
if (p != null)
TextView tt = (TextView) v.findViewById(R.id.game_txtTitle);
TextView tt1 = (TextView) v.findViewById(R.id.game_txtRelease);
TextView tt3 = (TextView) v.findViewById(R.id.game_txtPlatform);
if (tt != null)
tt.setText(p.getId());
if (tt1 != null)
tt1.setText(p.getCategory().getId());
if (tt3 != null)
tt3.setText(p.getDescription());
【问题讨论】:
这个 ListAdapter() 是什么?代码在哪里?? 在回答中查看我的编辑 【参考方案1】:public class Fragment1test extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
// Inflate the layout for this fragment
//This layout contains your list view
View view = inflater.inflate(R.layout.fragment_basic, container, false);
//now you must initialize your list view
ListView listview =(ListView)view.findViewById(R.id.your_listview);
//EDITED Code
String[] items = new String[] "Item 1", "Item 2", "Item 3";
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, items);
listview.setAdapter(adapter);
//To have custom list view use this : you must define CustomeAdapter class
// listview.setadapter(new CustomeAdapter(getActivity()));
//getActivty is used instead of Context
return view;
参考this link & question 了解如何创建自定义适配器
注意:不要使用列表片段或列表活动来创建自定义列表视图
编辑
ListView yourListView = (ListView)view.findViewById(R.id.ListView1);
//Here items must be a List<Items> according to your class instead of String[] array
ListAdapter listadapter = new ListAdapter(getActivity(), android.R.layout.simple_list_item_1, items)
ListView.setAdapter( listAdapter);
【讨论】:
谢谢,但我在 -> listview.setadapter(new CustomeAdapter()); "构造函数 ListAdapter() 未定义" 如何使用自己的列表设计?使用自定义适配器? 您是否参考了我在回答中给出的链接。它回答了你的问题。在自定义适配器类的 getView() 方法中,您可以通过为 listview 扩展项目布局来实现列表设计。 "无法从 ListView 类型中对非静态方法 setAdapter(ListAdapter) 进行静态引用" "构造函数 ListAdapter(FragmentActivity) 未定义" Listview中的字符'v'应该改为ListView。【参考方案2】:public class fragmentpassword extends Fragment
String[] name="A","B","C","D";
int [] image=R.drawable.ic_drawer,R.drawable.ic_drawer,R.drawable.ic_drawer,R.drawable.ic_drawer;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
View v = inflater.inflate(R.layout.layoutpassword, container, false);
ListView li=(ListView)v.findViewById(R.id.listViewPassword);
li.setAdapter(new PasswordAdapter(getActivity(),R.layout.passwordlay,name));
return v;
class PasswordAdapter extends ArrayAdapter
public PasswordAdapter(Context context, int resource, String[] objects)
super(context, resource, objects);
@Override
public View getView(int position, View convertView, ViewGroup parent)
View v=((Activity)getContext()).getLayoutInflater().inflate(R.layout.passwordlay,null);
TextView txt1 = (TextView) v.findViewById(R.id.textViewpasslay);
txt1.setText(name[position]);
ImageView img = (ImageView) v.findViewById(R.id.imageViewpasslay);
img.setBackgroundResource(image[position]);
return v;
**XML for customlist: passwordlay.xml**
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_
android:layout_>
<ImageView
android:layout_
android:layout_
android:id="@+id/imageViewpasslay" />
<TextView
android:layout_
android:layout_
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/textViewpasslay"/>
</LinearLayout>
**XML for fragment: layoutpassword.xml**
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_ android:layout_>
<ListView
android:layout_
android:layout_
android:id="@+id/listViewPassword"/>
</LinearLayout>
【讨论】:
【参考方案3】:片段不使用setContentView(int)
,所以你不能使用它,在public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
中使用inflater
并返回膨胀的视图。至于findViewById(int)
,就这样getActivity().findViewById(int)
吧。
【讨论】:
谢谢!我仍然没有工作,但我现在明白了很多。这个错误怎么办? "构造函数 ArrayAdapter(ListActivity, int, String[]) 未定义"以上是关于为片段制作自定义列表视图?的主要内容,如果未能解决你的问题,请参考以下文章
PagerSlidingTabStrip- 使用列表片段的自定义视图显示突然的行为