本文将介绍如何将setEmptyView的详细情况,特别是关于与ListFragment中的自定义列表布局一起使用的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也
本文将介绍如何将setEmptyView的详细情况,特别是关于与ListFragment中的自定义列表布局一起使用的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Activity-fragment-ListView展示、Android Fragment中ListView的OnItemClickListener无效、Android listFragment SetEmptyView 方法实现数据为空时的提示、android listview setEmptyview的知识。
本文目录一览:- 如何将setEmptyView()与ListFragment中的自定义列表布局一起使用(listview自定义item)
- Activity-fragment-ListView展示
- Android Fragment中ListView的OnItemClickListener无效
- Android listFragment SetEmptyView 方法实现数据为空时的提示
- android listview setEmptyview
如何将setEmptyView()与ListFragment中的自定义列表布局一起使用(listview自定义item)
我正在用几个打标机Fragments
。
当列表(Fragment
)中没有条目时,我想显示一条消息。
我尝试使用Textview
with,android:id="@id/android:empty
但是它不起作用。
自定义列表布局代码:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/padding_medium" > <TextView android:id="@+id/label_value" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="@dimen/padding_medium" android:text="@string/label_value" android:textColor="@android:color/white" android:textSize="18sp" /> <TextView android:id="@+id/label_date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="@dimen/padding_medium" android:text="@string/title_time" android:textColor="@android:color/white" android:textSize="16sp" /></RelativeLayout>
列表适配器类:
public class JournalAdapter extends ArrayAdapter<String> { private final Context context; private final List<String> values; private final List<String> dates; public JournalAdapter(Context context, List<String> values, List<String> dates) { super(context, R.layout.layout_journal_list, values); this.context = context; this.values = values; this.dates = dates; } @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.layout_journal_list, parent, false); TextView value = (TextView) rowView.findViewById(R.id.label_glucose); TextView date = (TextView) rowView.findViewById(R.id.label_date); value.setText(values.get(position)); date.setText(dates.get(position)); return rowView; }}
列表解析方法:
private void initListView() { values = dataSource.getAllValues(); List<String> values = new ArrayList<String>(); List<String> dates = new ArrayList<String>(); for (Value value : values) { values.add(Double.toString(value.getValue())); dates.add(secondsToDate(value.getDate())); } setListAdapter(new JournalAdapter(context, values, dates)); listView = getListView(); listView.setEmptyView(noItems("NO ITEMS")); listView.setOnItemClickListener(this); }
noItems
方法:
private TextView noItems(String text) { TextView emptyView = new TextView(context); emptyView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); emptyView.setText(text); emptyView.setTextColor(Color.WHITE); emptyView.setTextSize(20); emptyView.setVisibility(View.GONE); emptyView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); return emptyView; }
答案1
小编典典这对我有用(从WilliamRemacle提出的问题中得到了解决方案)。您可能会错过的是 将创建的 对象 添加 到
布局父对象 (下面方法底部的第二行代码): TextView``ListView
noItems
在我中,ListFragment
我使用以下方法为空视图获取视图:
private TextView noItems(String text) { TextView emptyView = new TextView(getActivity()); //Make sure you import android.widget.LinearLayout.LayoutParams; emptyView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); //Instead of passing resource id here I passed resolved color //That is, getResources().getColor((R.color.gray_dark)) emptyView.setTextColor(getResources().getColor(R.color.gray_dark)); emptyView.setText(text); emptyView.setTextSize(12); emptyView.setVisibility(View.GONE); emptyView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); //Add the view to the list view. This might be what you are missing ((ViewGroup) getListView().getParent()).addView(emptyView); return emptyView;}
然后在的onStart()
方法中ListFragment
设置空视图:
@Overridepublic void onStart() { super.onStart(); getListView().setEmptyView( noItems(getResources().getString(R.string.widget_empty)));}
Activity-fragment-ListView展示
在上一篇博客,Android-fragment简介-fragment的简单使用,介绍了简单的使用;
这篇博客主要讲解,在fragment做处理事情(Activity的事情)
Activity
package liudeli.activity.fragment;
import android.app.Activity;
import android.os.Bundle;
import liudeli.activity.R;
public class MyTestFragmentActivity2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_fragment2);
}
}
Activity 的 布局 activity_test_fragment2
<?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:id="@+id/fragment" 必须要指定好ID,否则运行会报错必须要指定class,否则无效果
-->
<fragment
android:id="@+id/fragment"
class="liudeli.activity.fragment.MyFragment2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Activity 的 布局 <fragment class 引用的 MyFragment2
package liudeli.activity.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import liudeli.activity.R;
public class MyFragment2 extends Fragment {
/**
* 创建View
* @param inflater 布局加载器
* @param container
* @param savedInstanceState 临时保存数据用的Bundle 和 Activity-onCreate方法一样
* @return
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
// 使用布局加载器加载
View view = inflater.inflate(R.layout.fragment_layout, null);
return view;
}
private ListView listView;
/**
* 此方法代表View创建已经完成✅
* @param view 上面方法创建View成功后返回过来的View
* @param savedInstanceState 临时保存数据用的Bundle 和 Activity-onCreate方法一样
*/
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
listView = view.findViewById(R.id.listview);
String[] strings = new String[]{"测试数据一", "测试数据二", "测试数据三"};
// 初始化适配器数据
final ListAdapter listAdapter = new ArrayAdapter(getActivity(), // 在Fragment不能使用this
android.R.layout.simple_list_item_1,
android.R.id.text1,
strings);
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String itmeValue = (String) listAdapter.getItem(position);
Toast.makeText(getActivity(), itmeValue, Toast.LENGTH_SHORT).show();
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getActivity(), "长按Item条目", Toast.LENGTH_SHORT).show();
return true;
}
});
}
}
MyFragment2 的 布局文件 fragment_layout
此属性可以解决,ListView Item 长按无效的问题:android:descendantFocusability="blocksDescendants"
<?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">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
/>
</LinearLayout>
效果:
Android Fragment中ListView的OnItemClickListener无效
人可能会变,但代码不一样,一个地方出错说不执行就是不执行。
网上说是ListView的 OnItemClick监听失效的原因。还有网上给出的解决方案是把加载ListView数据的每一项都加上
android:focusable="false"
然后一切问题就OK 了。
因为点击的焦点被ListView列表里的其他控件给获取了,所以就出现未反应情况。
Android listFragment SetEmptyView 方法实现数据为空时的提示
我们知道在可以在ListFragment 中很方便的加载数据。因为Android为我们内置了一个listview,我们可以直接将数据绑定在上面。然而,当我们的应用中没有数据显示的时候,如何可以有效的提示用户或者让用户进行其他操作呢?
我们这里可以使用 setEmptyView(view)方法来实现。
具体代码如下
public class MylistFragment extends ListFragment{
public View onCreatView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
View view = super.onCreateView(inflater, container,
savedInstanceState);
TextView emptyview = new TextView(getActivity());
emptyview.setText("数据为空");
ListView listview = (ListView)view.findViewById(android.R.id.list);
listview.setEmptyView(emptyview);
}
}
这里我动态创建了一个Textview 用来显示提示。然后使用Listview.setEmptyView(emptyview)方法绑定数据为空时的布局。运行后效果就有了。
但是我们有时候并不是仅仅只是提示用户而已,希望能有个丰富的界面来显示更多的内容。比如我们需要给用户一个按钮,让他进行其他操作。我们当然可以继续动态添加一个按钮,但是,我们有更好的方法,为什么不用呢?
因为我们继承的是ListFragment,所以,系统帮我们内置了ListView,当然我们也能使用自己的布局。
View view = inflater.inflate(R.layout.my_list, null, false);
用这句话替换super.onCreatView()方法。选择我们自己创建的布局文件。
my_list.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/crime_list_layout_id"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ListView
android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</FrameLayout>
然后,新建一个empty view empty_view.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:id="@+id/empty_layout">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="数据为空"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button_add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加数据"
android:layout_marginTop="40dp"/>
</LinearLayout>
将建立好的empty_view 添加到当前布局
View emptyview = inflater.inflate(R.layout.empty_view, null, false);
Button addDataButton = (Button)emptyview.findViewById(R.id.add_data);
addDataButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
addData();\\添加数据的具体实现
}
});
android listview setEmptyview
使用 listView 或者 gridView 时,当列表为空时,有时需要显示一个特殊的 empty view 来提示用户,一般情况下,如果你是继承 ListActivity,只要<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/list_view" />
<TextView
android:id="@+id/empty_list_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="List view is empty"
android:visibility="gone" />
</LinearLayout>
这种布局,当列表为空当列表为空时就会自动显示 TextView
如果继承 Activity 的话,想出现上面的效果,就需要手动
ListView list= (ListView)findViewById(R.id.mylist);
TextView tv= (TextView)findViewById(R.id.myempty);
list.setEmptyView(tv);
这是因为 setEmptyView 这个方法的设置是有限制的,就是设置的 View 必需在当前的 View hierarchy 里,亦即这个 View 需要被 add 到当前 View hierarchy 的一个结点上,如果没有添加到结点上的话,调用 setEmptyView (View v) 是没有任何效果的
还可以这样
TextView emptyView = new TextView(context);
emptyView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
emptyView.setText(“This appears when the list is empty”);
emptyView.setVisibility(View.GONE);
((ViewGroup)list.getParent()).addView(emptyView);
list.setEmptyView(emptyView);
或者
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
inflater = getLayoutInflater();
emptyView = inflater.inflate(R.layout.empty_view, null);
addContentView(emptyView, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
list.setEmptyView(emptyView);
这几个方法都是将 emptyview 加入到当前 view hierarchy 上
今天关于如何将setEmptyView和与ListFragment中的自定义列表布局一起使用的分享就到这里,希望大家有所收获,若想了解更多关于Activity-fragment-ListView展示、Android Fragment中ListView的OnItemClickListener无效、Android listFragment SetEmptyView 方法实现数据为空时的提示、android listview setEmptyview等相关知识,可以在本站进行查询。
本文标签: