Android: 自定义 Gridview 数据第一次没有绑定
Android: Custom Gridview data are not binding at first time
我通过从 Firebase DB 读取数据制作了一个 gridview 来显示图标列表(图像和文本),第一次调用 activity gridview 显示空白。只有在我改变方向后才会加载数据。
请指教如何让它在第一时间显示。(这是我第一次开发Android应用程序,之前从未编码过Java)
谢谢
下面是我的代码:
package com.abc.expensestracker;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
public class NewCategoryIconListActivity extends AppCompatActivity {
private GridView mIconListGridView;
private IconsListGridViewAdapter mIconListGridViewAdapter;
public ArrayList<IconsImageGridItemData> mIconsImageArrData = null;
private DatabaseReference mIconImagesRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_category_icon_list);
mIconListGridView = (GridView) findViewById(R.id.icons_list_gridview);
mIconImagesRef = FirebaseDatabase.getInstance().getReference().child("Iconimages");
mIconsImageArrData = new ArrayList<IconsImageGridItemData>();
setListData();
mIconListGridViewAdapter = new IconsListGridViewAdapter(this,R.layout.icons_single_item_layout,mIconsImageArrData);//(this, R.layout.icons_single_item_layout, mGridData);
mIconListGridView.setAdapter(mIconListGridViewAdapter);
mIconListGridViewAdapter.setGridData(mIconsImageArrData);
mIconListGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//Get item at position
IconsImageGridItemData item = (IconsImageGridItemData) parent.getItemAtPosition(position);
String selectedIconURL = item.getIconURL();
//send back the selected icon to parent activity
Intent returnIntent = getIntent();
returnIntent.putExtra("icon_URL",selectedIconURL);
setResult(Activity.RESULT_OK,returnIntent);
finish();
}
});
}
/****** Function to set data in ArrayList *************/
public void setListData()
{
mIconImagesRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot categorySnapshot: dataSnapshot.getChildren()){
String iconURL = categorySnapshot.child("iconURL").getValue(String.class);
final IconsImageGridItemData iconsImageData = new IconsImageGridItemData();
/******* Firstly take data in model object ******/
iconsImageData.setIconURL(iconURL);
/******** Take Model Object in ArrayList **********/
mIconsImageArrData.add(iconsImageData);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
您需要通知适配器您添加了一个项目。
所以在你的适配器中这样做:
public void add (IconsImageGridItemData iconsImageData) {
mIconsImageArrData.add (0, iconsImageData);
notifyItemInserted(0); //position to add the item
}
然后在您的 setListData 中:
final IconsImageGridItemData iconsImageData = new IconsImageGridItemData();
/******* Firstly take data in model object ******/
iconsImageData.setIconURL(iconURL);
adapter.add (iconsImageData);
/******** Take Model Object in ArrayList**********/
// mIconsImageArrData.add(iconsImageData);
根据你上面的代码,我可以理解的是,setListData();
中的任务在
执行后完成
mIconListGridViewAdapter.setGridData(mIconsImageArrData);
一个简单的更改应该有效。完成内部事件监听器的 onDataChange() 函数后,在你的 setListData() 函数中
/******** Take Model Object in ArrayList **********/
mIconsImageArrData.add(iconsImageData);
}// For finish
mIconListGridViewAdapter.setGridData(mIconsImageArrData);
}// end of onDataChange
这将确保您的适配器在 mIconsImageArrData
中完成数据复制后立即获取数据
注意:- 我假设您肯定在调用 notifyDataSetChanged();在 setGridData 函数中复制数据。
我通过从 Firebase DB 读取数据制作了一个 gridview 来显示图标列表(图像和文本),第一次调用 activity gridview 显示空白。只有在我改变方向后才会加载数据。
请指教如何让它在第一时间显示。(这是我第一次开发Android应用程序,之前从未编码过Java) 谢谢
下面是我的代码:
package com.abc.expensestracker;
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.AdapterView; import android.widget.GridView; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.util.ArrayList; public class NewCategoryIconListActivity extends AppCompatActivity { private GridView mIconListGridView; private IconsListGridViewAdapter mIconListGridViewAdapter; public ArrayList<IconsImageGridItemData> mIconsImageArrData = null; private DatabaseReference mIconImagesRef; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_new_category_icon_list); mIconListGridView = (GridView) findViewById(R.id.icons_list_gridview); mIconImagesRef = FirebaseDatabase.getInstance().getReference().child("Iconimages"); mIconsImageArrData = new ArrayList<IconsImageGridItemData>(); setListData(); mIconListGridViewAdapter = new IconsListGridViewAdapter(this,R.layout.icons_single_item_layout,mIconsImageArrData);//(this, R.layout.icons_single_item_layout, mGridData); mIconListGridView.setAdapter(mIconListGridViewAdapter); mIconListGridViewAdapter.setGridData(mIconsImageArrData); mIconListGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //Get item at position IconsImageGridItemData item = (IconsImageGridItemData) parent.getItemAtPosition(position); String selectedIconURL = item.getIconURL(); //send back the selected icon to parent activity Intent returnIntent = getIntent(); returnIntent.putExtra("icon_URL",selectedIconURL); setResult(Activity.RESULT_OK,returnIntent); finish(); } }); } /****** Function to set data in ArrayList *************/ public void setListData() { mIconImagesRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot categorySnapshot: dataSnapshot.getChildren()){ String iconURL = categorySnapshot.child("iconURL").getValue(String.class); final IconsImageGridItemData iconsImageData = new IconsImageGridItemData(); /******* Firstly take data in model object ******/ iconsImageData.setIconURL(iconURL); /******** Take Model Object in ArrayList **********/ mIconsImageArrData.add(iconsImageData); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } }
您需要通知适配器您添加了一个项目。 所以在你的适配器中这样做:
public void add (IconsImageGridItemData iconsImageData) {
mIconsImageArrData.add (0, iconsImageData);
notifyItemInserted(0); //position to add the item
}
然后在您的 setListData 中:
final IconsImageGridItemData iconsImageData = new IconsImageGridItemData();
/******* Firstly take data in model object ******/
iconsImageData.setIconURL(iconURL);
adapter.add (iconsImageData);
/******** Take Model Object in ArrayList**********/
// mIconsImageArrData.add(iconsImageData);
根据你上面的代码,我可以理解的是,setListData();
中的任务在
mIconListGridViewAdapter.setGridData(mIconsImageArrData);
一个简单的更改应该有效。完成内部事件监听器的 onDataChange() 函数后,在你的 setListData() 函数中
/******** Take Model Object in ArrayList **********/
mIconsImageArrData.add(iconsImageData);
}// For finish
mIconListGridViewAdapter.setGridData(mIconsImageArrData);
}// end of onDataChange
这将确保您的适配器在 mIconsImageArrData
中完成数据复制后立即获取数据注意:- 我假设您肯定在调用 notifyDataSetChanged();在 setGridData 函数中复制数据。