Android 片段中这两种类型的初始化之间有什么区别
我试图从活动的onCreate()方法初始化listfragment中的列表内容 活动代码的一部分:Android 片段中这两种类型的初始化之间有什么区别,android,android-fragments,Android,Android Fragments,我试图从活动的onCreate()方法初始化listfragment中的列表内容 活动代码的一部分: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dish); FragmentTran
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dish);
FragmentTransaction transaction1 = getSupportFragmentManager()
.beginTransaction();
mDishListFragment = new DishListFragment();
transaction1.add(R.id.dishList_fragment, mDishListFragment, "DishListFragment");
transaction1.commit();
mDishListFragment.showItem(totalList.get(0));
}
片段代码的一部分:
BinderData adapter = null;
List<HashMap<String, String>> dishDataCollection;
@Override
public void onCreate(Bundle savedInstanceState) {
Log.e("emenu", "Dishlistfragment on create");
super.onCreate(savedInstanceState);
adapter = new BinderData(getActivity(), R.id.article);
}
public void showItem(List<HashMap<String, String>> map) {
dishDataCollection = map;
if (dishDataCollection != null) {
adapter.init(dishDataCollection); //NullPOinterException
}
setListAdapter(adapter);
}
而不是像我在上面的代码块中那样初始化
我需要使用fragmenttransactionadd()方法,因为我需要能够在需要时隐藏和显示片段
两种类型的初始化之间有什么区别?为什么前者不起作用,而后者起作用
希望你们能帮忙。如果您需要代码的任何其他部分,请告诉我
适配器代码供您参考:
LayoutInflater inflater;
ImageView thumb_image;
List<HashMap<String, String>> dishDataCollection;
ViewHolder holder;
public BinderData(Context context, int list_row) {
// super(context , list_row , map);
super(context, list_row);
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void init(List<HashMap<String, String>> map) {
this.dishDataCollection = map;
}
public int getCount() {
// TODO Auto-generated method stub
// return idlist.size();
return dishDataCollection.size();
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView != null)
if (position == mItemIndex) {
convertView.setSelected(true);
convertView.setPressed(true);
convertView.setBackgroundResource(R.drawable.gradient_bg_hover);
} else {
convertView.setBackgroundResource(R.drawable.gradient_bg);
}
View vi = convertView;
if (convertView == null) {
vi = inflater.inflate(R.layout.list_row, parent, false);
holder = new ViewHolder();
holder.name = (TextView) vi.findViewById(R.id.dish); // city name
holder.rate = (TextView) vi.findViewById(R.id.rate); // city weather
// overview
holder.shortdescription = (TextView) vi
.findViewById(R.id.shortdescription); // city temperature
holder.dishImage = (ImageView) vi.findViewById(R.id.list_image); // thumb
// image
// vi.setActivated(true);
vi.setTag(holder);
} else {
holder = (ViewHolder) vi.getTag();
}
// Setting all values in listview
holder.name.setText(dishDataCollection.get(position).get(KEY_NAME));
holder.rate.setText(dishDataCollection.get(position).get(KEY_RATE));
holder.shortdescription.setText(dishDataCollection.get(position).get(
KEY_SHORT));
// Setting an image
String uri = "drawable/"
+ dishDataCollection.get(position).get(KEY_ICON);
int imageResource = vi
.getContext()
.getApplicationContext()
.getResources()
.getIdentifier(
uri,
null,
vi.getContext().getApplicationContext()
.getPackageName());
Drawable image = vi.getContext().getResources()
.getDrawable(imageResource);
holder.dishImage.setImageDrawable(image);
return vi;
}
/*
*
* */
static class ViewHolder {
TextView name;
TextView rate;
TextView shortdescription;
ImageView dishImage;
}
public void setSelectItem(int index) {
mItemIndex = index;
}
public int getSelectItem() {
return mItemIndex;
}
充气机;
ImageView拇指图像;
数据收集清单;
视窗座;
公共BinderData(上下文,int list_行){
//超级(上下文、列表行、地图);
超级(上下文、列表行);
充气器=(充气器)上下文
.getSystemService(上下文布局\充气机\服务);
}
公共void init(列表映射){
this.dishDataCollection=map;
}
public int getCount(){
//TODO自动生成的方法存根
//返回idlist.size();
返回dishDataCollection.size();
}
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView!=null)
如果(位置==mItemIndex){
convertView.setSelected(true);
convertView.setPressed(true);
convertView.setBackgroundResource(R.drawable.gradient\u bg\u hover);
}否则{
convertView.setBackgroundResource(R.drawable.gradient_bg);
}
视图vi=转换视图;
if(convertView==null){
vi=充气机。充气(R.layout.list_行,父项,false);
holder=新的ViewHolder();
holder.name=(TextView)vi.findviewbyd(R.id.dish);//城市名称
holder.rate=(TextView)vi.findViewById(R.id.rate);//城市天气
//概述
holder.shortdescription=(TextView)vi
.findViewById(R.id.shortdescription);//城市温度
holder.dishImage=(ImageView)vi.findviewbyd(R.id.list_image);//拇指
//形象
//vi.setActivated(真);
vi.setTag(支架);
}否则{
holder=(ViewHolder)vi.getTag();
}
//在listview中设置所有值
holder.name.setText(dishDataCollection.get(position.get(KEY_name));
holder.rate.setText(dishDataCollection.get(position.get(KEY_rate));
holder.shortdescription.setText(dishDataCollection.get(position.get)(
键(短);;
//设置图像
String uri=“drawable/”
+dishDataCollection.get(位置).get(按键图标);
int imageResource=vi
.getContext()
.getApplicationContext()
.getResources()
.getIdentifier(
乌里,
无效的
vi.getContext().getApplicationContext()
.getPackageName());
Drawable image=vi.getContext().getResources()
.getDrawable(图像资源);
支架.dishImage.setImageDrawable(图像);
返回vi;
}
/*
*
* */
静态类视窗夹{
文本视图名称;
文本浏览率;
文本视图短描述;
图像视图;
}
公共无效集合选择项(整数索引){
mItemIndex=指数;
}
public int getSelectItem(){
返回Mindex;
}
在片段的onCreate()
中,您的视图尚不存在。您应该将初始化代码移动到onCreateView()
。熟悉片段的生命周期:您可能需要膨胀视图,而不是setContentView(R.layout.activity\u dish)
示例
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class DetailFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_rssitem_detail,
container, false);
return view;
}
public void setText(String item) {
TextView view = (TextView) getView().findViewById(R.id.detailsText);
view.setText(item);
}
}
不同之处在于,在第一个示例中,您正在创建DishListFragment的新实例,而在第二个示例中,您正在创建指向该片段现有实例的指针。你应该关注NullPointerException并找出原因。你能把BinderData类的代码放进去吗?@RaúlJuárez:我刚刚添加了适配器。请不要告诉我,即使我用简单的textView替换listview并尝试在其上设置Text()时,也会出现nullPointer错误。我的意思是,这似乎不是适配器的问题。在事务中调用
commit
后,在事务上调用executePendingTransactions
方法1
View view = inflater.inflate(R.layout.fragment_rsslist_overview,
container, false);
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class DetailFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_rssitem_detail,
container, false);
return view;
}
public void setText(String item) {
TextView view = (TextView) getView().findViewById(R.id.detailsText);
view.setText(item);
}
}