向下滚动Feed片段时,我的应用会崩溃。就像我说的,其中一个是为了展示每个用户的帖子,另一个是仅显示跟随。关于崩溃logcat说:
java.lang.ClassCastException: com.example.ca_ltd.ting.Home.CameraFragment无法转换为 com.example.ca_ltd.ting.Home.HomeFragment at com.example.ca_ltd.ting.Home.HomeActivity.onLoadMoreItems(HomeActivity.java:43) 在 com.example.ca_ltd.ting.Utils.MainfeedListAdapter.loadMoreData(MainfeedListAdapter.java:273) 在 com.example.ca_ltd.ting.Utils.MainfeedListAdapter.getView(MainfeedListAdapter.java:254)
不要误导CameraFragment名称。首先,它本来是一个允许用户拍摄照片的片段,但后来我用HomeFragment代码替换了该代码,并进行了两次更改,使所有帖子都显示在片段中,而不像HomeFragment那样只跟踪用户帖子这样做。请帮忙:)。
HomeFragment:
public class HomeFragment extends Fragment {
private static final String TAG = "HomeFragment";
//vars
private ArrayList<Photo> mPhotos;
private ArrayList<Photo> mPaginatedPhotos;
private ArrayList<String> mFollowing;
private ListView mListView;
private MainfeedListAdapter mAdapter;
private int mResults;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
mListView = (ListView) view.findViewById(R.id.listView);
mFollowing = new ArrayList<>();
mPhotos = new ArrayList<>();
getFollowing();
return view;
}
private void getFollowing(){
Log.d(TAG, "getFollowing: searching for following");
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference
.child(getString(R.string.dbname_following))
.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
Log.d(TAG, "onDataChange: found user: " +
singleSnapshot.child(getString(R.string.field_user_id)).getValue());
mFollowing.add(singleSnapshot.child(getString(R.string.field_user_id)).getValue().toString());
}
mFollowing.add(FirebaseAuth.getInstance().getCurrentUser().getUid());
//get the photos
getPhotos();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void getPhotos(){
Log.d(TAG, "getPhotos: getting photos");
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
for(int i = 0; i < mFollowing.size(); i++){
final int count = i;
Query query = reference
.child(getString(R.string.dbname_user_photos))
.child(mFollowing.get(i))
.orderByChild(getString(R.string.field_user_id))
.equalTo(mFollowing.get(i));
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
Photo photo = new Photo();
Map<String, Object> objectMap = (HashMap<String, Object>) singleSnapshot.getValue();
photo.setCaption(objectMap.get(getString(R.string.field_caption)).toString());
photo.setTags(objectMap.get(getString(R.string.field_tags)).toString());
photo.setPhoto_id(objectMap.get(getString(R.string.field_photo_id)).toString());
photo.setUser_id(objectMap.get(getString(R.string.field_user_id)).toString());
photo.setDate_created(objectMap.get(getString(R.string.field_date_created)).toString());
photo.setImage_path(objectMap.get(getString(R.string.field_image_path)).toString());
ArrayList<Comment> comments = new ArrayList<Comment>();
for (DataSnapshot dSnapshot : singleSnapshot
.child(getString(R.string.field_comments)).getChildren()){
Comment comment = new Comment();
comment.setUser_id(dSnapshot.getValue(Comment.class).getUser_id());
comment.setComment(dSnapshot.getValue(Comment.class).getComment());
comment.setDate_created(dSnapshot.getValue(Comment.class).getDate_created());
comments.add(comment);
}
photo.setComments(comments);
mPhotos.add(photo);
}
if(count >= mFollowing.size() -1){
//display our photos
displayPhotos();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
private void displayPhotos(){
mPaginatedPhotos = new ArrayList<>();
if(mPhotos != null){
try{
Collections.sort(mPhotos, new Comparator<Photo>() {
@Override
public int compare(Photo o1, Photo o2) {
return o2.getDate_created().compareTo(o1.getDate_created());
}
});
int iterations = mPhotos.size();
if(iterations > 10){
iterations = 10;
}
mResults = 10;
for(int i = 0; i < iterations; i++){
mPaginatedPhotos.add(mPhotos.get(i));
}
mAdapter = new MainfeedListAdapter(getActivity(), R.layout.layout_mainfeed_listitem, mPaginatedPhotos);
mListView.setAdapter(mAdapter);
}catch (NullPointerException e){
Log.e(TAG, "displayPhotos: NullPointerException: " + e.getMessage() );
}catch (IndexOutOfBoundsException e){
Log.e(TAG, "displayPhotos: IndexOutOfBoundsException: " + e.getMessage() );
}
}
}
public void displayMorePhotos(){
Log.d(TAG, "displayMorePhotos: displaying more photos");
try{
if(mPhotos.size() > mResults && mPhotos.size() > 0){
int iterations;
if(mPhotos.size() > (mResults + 10)){
Log.d(TAG, "displayMorePhotos: there are greater than 10 more photos");
iterations = 10;
}else{
Log.d(TAG, "displayMorePhotos: there is less than 10 more photos");
iterations = mPhotos.size() - mResults;
}
//add the new photos to the paginated results
for(int i = mResults; i < mResults + iterations; i++){
mPaginatedPhotos.add(mPhotos.get(i));
}
mResults = mResults + iterations;
mAdapter.notifyDataSetChanged();
}
}catch (NullPointerException e){
Log.e(TAG, "displayPhotos: NullPointerException: " + e.getMessage() );
}catch (IndexOutOfBoundsException e){
Log.e(TAG, "displayPhotos: IndexOutOfBoundsException: " + e.getMessage() );
}
}
}
相机碎片
public class CameraFragment extends Fragment {
private static final String TAG = "CameraFragment";
//vars
private ArrayList<Photo> mPhotos;
private ArrayList<Photo> mPaginatedPhotos;
private ArrayList<String> mFollowing;
private ListView mListView;
private MainfeedListAdapter mAdapter;
private int mResults;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
mListView = (ListView) view.findViewById(R.id.listView);
mFollowing = new ArrayList<>();
mPhotos = new ArrayList<>();
getFollowing();
return view;
}
private void getFollowing(){
Log.d(TAG, "getFollowing: searching for following");
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference
.child(getString(R.string.dbname_users));
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
Log.d(TAG, "onDataChange: found user: " +
singleSnapshot.child(getString(R.string.field_user_id)).getValue());
mFollowing.add(singleSnapshot.child(getString(R.string.field_user_id)).getValue().toString());
}
mFollowing.add(FirebaseAuth.getInstance().getCurrentUser().getUid());
//get the photos
getPhotos();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void getPhotos(){
Log.d(TAG, "getPhotos: getting photos");
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
for(int i = 0; i < mFollowing.size(); i++){
final int count = i;
Query query = reference
.child(getString(R.string.dbname_user_photos))
.child(mFollowing.get(i))
.orderByChild(getString(R.string.field_user_id))
.equalTo(mFollowing.get(i));
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
Photo photo = new Photo();
Map<String, Object> objectMap = (HashMap<String, Object>) singleSnapshot.getValue();
photo.setCaption(objectMap.get(getString(R.string.field_caption)).toString());
photo.setTags(objectMap.get(getString(R.string.field_tags)).toString());
photo.setPhoto_id(objectMap.get(getString(R.string.field_photo_id)).toString());
photo.setUser_id(objectMap.get(getString(R.string.field_user_id)).toString());
photo.setDate_created(objectMap.get(getString(R.string.field_date_created)).toString());
photo.setImage_path(objectMap.get(getString(R.string.field_image_path)).toString());
ArrayList<Comment> comments = new ArrayList<>();
for (DataSnapshot dSnapshot : singleSnapshot
.child(getString(R.string.field_comments)).getChildren()){
Comment comment = new Comment();
comment.setUser_id(dSnapshot.getValue(Comment.class).getUser_id());
comment.setComment(dSnapshot.getValue(Comment.class).getComment());
comment.setDate_created(dSnapshot.getValue(Comment.class).getDate_created());
comments.add(comment);
}
photo.setComments(comments);
mPhotos.add(photo);
}
if(count >= mFollowing.size() -1){
//display our photos
displayPhotos();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
private void displayPhotos(){
mPaginatedPhotos = new ArrayList<>();
if(mPhotos != null){
try{
Collections.sort(mPhotos, new Comparator<Photo>() {
@Override
public int compare(Photo o1, Photo o2) {
return o2.getDate_created().compareTo(o1.getDate_created());
}
});
int iterations = mPhotos.size();
if(iterations > 10){
iterations = 10;
}
mResults = 10;
for(int i = 0; i < iterations; i++){
mPaginatedPhotos.add(mPhotos.get(i));
}
mAdapter = new MainfeedListAdapter(getActivity(), R.layout.layout_mainfeed_listitem, mPaginatedPhotos);
mListView.setAdapter(mAdapter);
}catch (NullPointerException e){
Log.e(TAG, "displayPhotos: NullPointerException: " + e.getMessage() );
}catch (IndexOutOfBoundsException e){
Log.e(TAG, "displayPhotos: IndexOutOfBoundsException: " + e.getMessage() );
}
}
}
public void displayMorePhotos(){
Log.d(TAG, "displayMorePhotos: displaying more photos");
try{
if(mPhotos.size() > mResults && mPhotos.size() > 0){
int iterations;
if(mPhotos.size() > (mResults + 10)){
Log.d(TAG, "displayMorePhotos: there are greater than 10 more photos");
iterations = 10;
}else{
Log.d(TAG, "displayMorePhotos: there is less than 10 more photos");
iterations = mPhotos.size() - mResults;
}
//add the new photos to the paginated results
for(int i = mResults; i < mResults + iterations; i++){
mPaginatedPhotos.add(mPhotos.get(i));
}
mResults = mResults + iterations;
mAdapter.notifyDataSetChanged();
}
}catch (NullPointerException e){
Log.e(TAG, "displayPhotos: NullPointerException: " + e.getMessage() );
}catch (IndexOutOfBoundsException e){
Log.e(TAG, "displayPhotos: IndexOutOfBoundsException: " + e.getMessage() );
}
}
}
HomeActivity:
public class HomeActivity extends AppCompatActivity implements
MainfeedListAdapter.OnLoadMoreItemsListener{
@Override
public void onLoadMoreItems() {
Log.d(TAG, "onLoadMoreItems: displaying more photos");
HomeFragment fragment = (HomeFragment)getSupportFragmentManager()
//CameraFragment fragment2 = (CameraFragment)getSupportFragmentManager()
.findFragmentByTag("android:switcher:" + R.id.viewpager_container + ":" + mViewPager.getCurrentItem());
CameraFragment fragment2 = (CameraFragment)getSupportFragmentManager()
.findFragmentByTag("android:switcher:" + R.id.viewpager_container + ":" + mViewPager.getCurrentItem());
if(fragment != null){
fragment.displayMorePhotos();}
if(fragment2 != null){
fragment2.displayMorePhotos();}
}
private static final String TAG = "HomeActivity";
private static final int ACTIVITY_NUM = 0;
private static final int HOME_FRAGMENT = 1;
private Context mContext = HomeActivity.this;
//firebase
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
//widgets
private ViewPager mViewPager;
private FrameLayout mFrameLayout;
private RelativeLayout mRelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Log.d(TAG, "onCreate: starting.");
mViewPager = (ViewPager) findViewById(R.id.viewpager_container);
mFrameLayout = (FrameLayout) findViewById(R.id.container);
mRelativeLayout = (RelativeLayout) findViewById(R.id.relLayoutParent);
setupFirebaseAuth();
initImageLoader();
setupBottomNavigationView();
setupViewPager();
}
public void onCommentThreadSelected(Photo photo, String callingActivity){
Log.d(TAG, "onCommentThreadSelected: selected a coemment thread");
ViewCommentsFragment fragment = new ViewCommentsFragment();
Bundle args = new Bundle();
args.putParcelable(getString(R.string.photo), photo);
args.putString(getString(R.string.home_activity), getString(R.string.home_activity));
fragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.addToBackStack(getString(R.string.view_comments_fragment));
transaction.commit();
}
public void hideLayout(){
Log.d(TAG, "hideLayout: hiding layout");
mRelativeLayout.setVisibility(View.GONE);
mFrameLayout.setVisibility(View.VISIBLE);
}
public void showLayout(){
Log.d(TAG, "hideLayout: showing layout");
mRelativeLayout.setVisibility(View.VISIBLE);
mFrameLayout.setVisibility(View.GONE);
}
@Override
public void onBackPressed() {
super.onBackPressed();
if(mFrameLayout.getVisibility() == View.VISIBLE){
showLayout();
}
}
private void initImageLoader(){
UniversalImageLoader universalImageLoader = new UniversalImageLoader(mContext);
ImageLoader.getInstance().init(universalImageLoader.getConfig());
}
/**
* Responsible for adding the 3 tabs: Camera, Home, Messages
*/
private void setupViewPager(){
SectionsPagerAdapter adapter = new SectionsPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new HomeFragment());//index 1
adapter.addFragment(new CameraFragment());
mViewPager.setAdapter(adapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
// tabLayout.getTabAt(0).setIcon(R.drawable.ic_camera);
tabLayout.getTabAt(0).setIcon(R.drawable.ic_instagram_black);
tabLayout.getTabAt(1).setIcon(R.drawable.ic_arrow);
}
/**
* BottomNavigationView setup
*/
private void setupBottomNavigationView(){
Log.d(TAG, "setupBottomNavigationView: setting up BottomNavigationView");
BottomNavigationViewEx bottomNavigationViewEx = (BottomNavigationViewEx) findViewById(R.id.bottomNavViewBar);
BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx);
BottomNavigationViewHelper.enableNavigation(mContext, this,bottomNavigationViewEx);
Menu menu = bottomNavigationViewEx.getMenu();
MenuItem menuItem = menu.getItem(ACTIVITY_NUM);
menuItem.setChecked(true);
}
/*
------------------------------------ Firebase ---------------------------------------------
*/
/**
* checks to see if the @param 'user' is logged in
* @param user
*/
private void checkCurrentUser(FirebaseUser user){
Log.d(TAG, "checkCurrentUser: checking if user is logged in.");
if(user == null){
Intent intent = new Intent(mContext, LoginActivity.class);
startActivity(intent);
}
}
/**
* Setup the firebase auth object
*/
private void setupFirebaseAuth(){
Log.d(TAG, "setupFirebaseAuth: setting up firebase auth.");
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
//check if the user is logged in
checkCurrentUser(user);
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
// ...
}
};
}
@Override
public void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
mViewPager.setCurrentItem(HOME_FRAGMENT);
checkCurrentUser(mAuth.getCurrentUser());
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
}
这是MainfeedListAdapter,因为它将超过30000个字母。 https://drive.google.com/open?id=0B1qYcLtn_DV8andxWUdiQ28tWWM