تطبيق إعلانات بأندرويد و firebase الجزء الرابع

imadbelasri Android
AN

فهاد الجزء الرابع من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملف لي غادي يمكن المستخدم لي مكونيكطي من إضافة إعلان منبعد غادي نشوفوا كيفاش نسترجعوا الإعلانات ونعرضهم ف recyclerview لي سبق وزدناها فالملف الرئيسي ولي غادي يمكن للمستخدم يكليكي على الإعلان لي بغا ويشاهد التفاصيل ديالو.


نظرة سريعة بالفيديو


1- إضافة الإعلان لقاعدة البيانات

باش نزيد الإعلان فقاعدة البيانات كنمشي ل dossier java فيه عندي الملف CreateAds فيه كنزيد الكود لي كيسترجع les champs لي زدنا فل interface من بعد كنزيد la table لي سميتها Ads منبعد كاين ل fonction checkIfLogged لي كتحقق واش المستخدم مكونيكطي مكنش كتديه للملف ديال ل connexion منبعد كاين ل fonction getCities لي كتعمر select box ديال المدن بالمدن وكاين getCategories لي كتعمر select box ديال les catégories ب les catégories  ثم كاين ل fonction uploadAdImage لي كتمكن من إضافة صورة الإعلان لي كتنفد ملي كيكليكي المستخدم على ل ImageButton ولي كتمكنو من اختيار صورة منبعد كاين onActivityResult لي كتسترجع chemin ديال الصورة وكنخدم بواحد الbibliothèque لي كتمكني باش ندير Crop للصورة ولي زدناها فالملف build.gradle فمنبعد مكنديرلها ل crop كنزيدها لل ImageButton من بعد كاين ل fonction createNewAd لي كتمكن من إضافة المعلومات الخاصة بالإعلان لقاعدة البيانات وتوجيه المستخدم للصفحة الرئيسية الكود ديال الملف هو :

                                                    
                                                        package com.example.belasri.hiresell;

import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatEditText;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.UserInfo;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;

import java.util.ArrayList;

public class CreateAds extends AppCompatActivity {
    private Spinner citieSpinner,catSpinner;
    private AppCompatEditText titleEdit,descTitle,phoneEdit;
    private Toolbar toolbar;
    ImageButton imageButton;
    private StorageReference storageReference;
    private FirebaseDatabase database;
    private DatabaseReference databaseReference;
    private FirebaseAuth.AuthStateListener authStateListener;
    private FirebaseAuth mAuth;
    private  static final int RESULT_IMAGE = 1;
    Uri resultUri;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.create_ads);
        mAuth = FirebaseAuth.getInstance();
        storageReference = FirebaseStorage.getInstance().getReference();
        databaseReference = database.getInstance().getReference().child("Ads");
        checkIfLogged();
        citieSpinner = (Spinner) findViewById(R.id.citySpinner);
        catSpinner = (Spinner) findViewById(R.id.categorieSpinner);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        imageButton = (ImageButton) findViewById(R.id.image_uploaded);
        titleEdit = (AppCompatEditText) findViewById(R.id.adtitle);
        descTitle = (AppCompatEditText) findViewById(R.id.adbody);
        phoneEdit = (AppCompatEditText) findViewById(R.id.userTel);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getCitites();
        getCategories();
        citieSpinner.setSelection(0);
        catSpinner.setSelection(0);
    }
    @Override
    protected void onStart() {
        mAuth.addAuthStateListener(authStateListener);
        super.onStart();
    }
    @Override
    public void onBackPressed()
    {
        super.onBackPressed();
        finish();
    }
    public void getCitites(){
        ArrayList<String> cities = new ArrayList<>();
        cities.add("Veuillez choisir une ville");
        cities.add("Fés");
        cities.add("Rabat");
        cities.add("Casablanca");
        cities.add("Taza");
        cities.add("Tanger");
        cities.add("Agadir");
        cities.add("Oujda");
        cities.add("Marrakech");
        final ArrayAdapter<String> spinnnerArrayAdapter = new ArrayAdapter<String>(this,R.layout.spinner_item,cities){
            @Override
            public boolean isEnabled(int position){
                if(position == 0)
                {
                    // Disable the first item from Spinner
                    return false;
                }
                else
                {
                    return true;
                }
            }
            @Override
            public View getDropDownView(int position, View convertView,ViewGroup parent) {
                View view = super.getDropDownView(position, convertView, parent);
                TextView tv = (TextView) view;
                if(position==0) {
                    // Set the disable item text color
                    tv.setTextColor(Color.GRAY);
                }
                return view;
            }
        };
        spinnnerArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
        citieSpinner.setAdapter(spinnnerArrayAdapter);
    }
    public void getCategories(){
        ArrayList<String> categories = new ArrayList<>();
        categories.add("Veuillez chosir une catégorie");
        categories.add("Véhicules");
        categories.add("Animaux");
        categories.add("Immobilier");
        categories.add("Informatique");
        categories.add("Emplois");
        categories.add("Vétements");
        categories.add("Ventes divers");
        final ArrayAdapter<String> spinnnerCatArrayAdapter = new ArrayAdapter<String>(this,R.layout.spinner_item,categories){
            @Override
            public boolean isEnabled(int position){
                if(position == 0)
                {
                    // Disable the first item from Spinner
                    return false;
                }
                else
                {
                    return true;
                }
            }
            @Override
            public View getDropDownView(int position, View convertView,ViewGroup parent) {
                View view = super.getDropDownView(position, convertView, parent);
                TextView tv = (TextView) view;
                if(position==0) {
                    // Set the disable item text color
                    tv.setTextColor(Color.GRAY);
                }
                return view;
            }
        };
        spinnnerCatArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
        catSpinner.setAdapter(spinnnerCatArrayAdapter);
    }
    public void uploadAdImage(View view) {
        Intent gallery = new Intent(Intent.ACTION_GET_CONTENT);
        gallery.setType("image/*");
        startActivityForResult(gallery,RESULT_IMAGE);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == RESULT_IMAGE && resultCode == RESULT_OK){
            Uri imagePath = data.getData();
            //make the user crop the image
            CropImage.activity(imagePath).setGuidelines(CropImageView.Guidelines.ON)
                    .setAspectRatio(1,1)
                    .start(this);
        }
        //if image has successufully croped
        if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE){
            //get result
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            if(resultCode == RESULT_OK){
                resultUri = result.getUri();
                imageButton.setImageURI(resultUri);
                imageButton.setTag(resultUri);
            }else if(resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE){
                Exception error = result.getError();
            }
        }
    }
    public void checkIfLogged(){
        authStateListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                if(firebaseAuth.getCurrentUser() == null) {
                    Intent loginIntent = new Intent(CreateAds.this,LoginActivity.class);
                    //prevent user from returning back
                    loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(loginIntent);
                }
            }
        };
    }
    public void createNewAd(View view) {
        final String title = titleEdit.getText().toString().trim();
        final String desc = descTitle.getText().toString().trim();
        final String phone = phoneEdit.getText().toString().trim();
        if(!TextUtils.isEmpty(title) && !TextUtils.isEmpty(desc) && !TextUtils.isEmpty(phone)) {
            StorageReference filePath = storageReference.child("images").child(resultUri.getLastPathSegment());
            filePath.putFile(resultUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    @SuppressWarnings("VisibleForTests") Uri downloadUrl = taskSnapshot.getDownloadUrl();
                    UserInfo userInfo = mAuth.getCurrentUser();
                    Log.d("userInfo", userInfo.toString());
                    DatabaseReference newPost = databaseReference.push();
                    newPost.child("title").setValue(title);
                    newPost.child("description").setValue(desc);
                    newPost.child("imageUrl").setValue(downloadUrl.toString());
                    newPost.child("user_id").setValue(userInfo.getUid());
                    newPost.child("category").setValue(catSpinner.getSelectedItem().toString());
                    newPost.child("city").setValue(citieSpinner.getSelectedItem().toString());
                    Toast.makeText(CreateAds.this, "Annonce ajoutée avec succés", Toast.LENGTH_SHORT).show();
                    Intent home = new Intent(CreateAds.this, MainActivity.class);
                    home.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(home);
                }
            });
        }else{
            Toast.makeText(this, "Veuillez remplir tous les champs", Toast.LENGTH_SHORT).show();
        }
    }
}
                                                    
                                                

2- استرجاع وعرض الإعلانات من قاعدة البيانات

فباش نعرض الإعلانات من قاعدة البيانات كنرجع للملف MainActivity لي ف dossier java منبعد كنسترجع Recycler View و NavigationView ول BottomNavigation منبعد مكنزيدهم كنسترجع les tables Ads و profiles ثم كنحدد كل item فل menu ملي نكليكي عليه يديني للملف الخاص به من بعد عندي ل fonction createNewAd لي ملي كيكليكي المستخدم على ل floating button كتديه للملف الخاص بإضافة إعلان ثم منبعد عندي ل fonction showAds لي كتمكن من عرض الإعلانات ف recycler view كنخدم ب FirebaseRecyclerAdapter لي كيمكنا باش نزيدو المعلومات لي استرجعنا فبلايصهم فكنعطيه ل class AdInfo و ل list_item.xml ول AdsViewHolder لي غادي تمكنا باش نmodifier المعلومات لي فال ImageView و TextView منبعد مكنسترجعهم وكنعطيه ايضا référence لقاعدة البيانات وكنزيد لRecyclerView   ل onclick لي كتمكني باش ملي نضغط على شي إعلان كنصيفط ل id ديالو ل AdDetails لي غادي تمكنا من مشاهدة تفاصيل لإعلان ولي غادي نزيدوها منبعد ثم كاين ل fonction showMenu لي كنخدم بها باش ن afficher المعلومات الخاصة بالمستخدم يلا كان مكونيكطي مكانش كن afficher غير les liens ل connexion و inscription الكود ديال الملف هو :

                                                        
                                                            package com.example.belasri.hiresell;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.auth.FirebaseAuth;
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 com.squareup.picasso.Picasso;

import helpers.BottomNavigationViewHelper;
import models.AdInfo;
import models.SessionManager;


public class MainActivity extends AppCompatActivity  implements NavigationView.OnNavigationItemSelectedListener, BottomNavigationView.OnNavigationItemSelectedListener{
    private Toolbar toolbar;
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;
    private BottomNavigationView bottomNavigationView;
    private FloatingActionButton createAd;
    private BottomNavigationViewHelper bottomNavigationViewHelper;
    private FirebaseAuth.AuthStateListener authStateListener;
    private FirebaseAuth mAuth;
    private TextView userHeaderName,userEmailName;
    private ImageView HeaderProfileImage;
    private DatabaseReference db;
    private DatabaseReference adsDb;
    private RecyclerView recyclerview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nav_drawer);
        mAuth = FirebaseAuth.getInstance();
        showMenu();
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNav);
        bottomNavigationView.setOnNavigationItemSelectedListener(this);
        bottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
        navigationView = (NavigationView) findViewById(R.id.navView);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
        createAd = (FloatingActionButton) findViewById(R.id.createBtn);
        navigationView.setNavigationItemSelectedListener(this);
        recyclerview = (RecyclerView) findViewById(R.id.recyclerView);
        LinearLayoutManager linearManager = new LinearLayoutManager(this);
        linearManager.setOrientation(linearManager.VERTICAL);
        recyclerview.setLayoutManager(new GridLayoutManager(this,2));
        recyclerview.setItemAnimator(new DefaultItemAnimator());
        db = FirebaseDatabase.getInstance().getReference().child("profiles");
        adsDb = FirebaseDatabase.getInstance().getReference().child("Ads");
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.open_drawer,R.string.close_drawer);
        drawerLayout.setDrawerListener(toggle);
        toggle.syncState();
        showAds();
        createNewAd();
    }
    @Override
    protected void onStart() {
        mAuth.addAuthStateListener(authStateListener);
        super.onStart();
    }
    @Override
    public void onBackPressed() {
        if(drawerLayout.isDrawerOpen(GravityCompat.START)){
            drawerLayout.closeDrawer(GravityCompat.START);
        }else {
            super.onBackPressed();
        }
    }
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        switch(id){
            case R.id.home :
                Intent homeIntent = new Intent(MainActivity.this,MainActivity.class);
                startActivity(homeIntent);
                break;
            case R.id.fav :
                Intent favsIntent = new Intent(MainActivity.this,FavActivity.class);
                startActivity(favsIntent);
                break;
            case R.id.register :
                Intent registerIntent = new Intent(MainActivity.this,RegisterActivity.class);
                startActivity(registerIntent);
                break;
            case R.id.login :
                Intent loginIntent = new Intent(MainActivity.this,LoginActivity.class);
                startActivity(loginIntent);
                break;
            case R.id.profile :
                Intent profileIntent = new Intent(MainActivity.this,ProfileActivity.class);
                startActivity(profileIntent);
                break;
            case R.id.search :
                Intent searchIntent = new Intent(MainActivity.this,SearchActivity.class);
                startActivity(searchIntent);
                break;
            case R.id.logout :
                mAuth.signOut();
                Intent home = new Intent(MainActivity.this,MainActivity.class);
                startActivity(home);
                break;
        }
        drawerLayout.closeDrawer(GravityCompat.START);
        return true;
    }
    public void createNewAd(){
        createAd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent createAd = new Intent(MainActivity.this,CreateAds.class);
                startActivity(createAd);
            }
        });
    }
    private void showAds(){
        FirebaseRecyclerAdapter<AdInfo, AdsViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<AdInfo, AdsViewHolder>(
                AdInfo.class,
                R.layout.list_item,
                AdsViewHolder.class,
                adsDb
        ) {
            @Override
            protected void populateViewHolder(AdsViewHolder viewHolder, AdInfo model, int position) {
                //get selected post id
                final String ad_id = getRef(position).getKey().toString();
                viewHolder.setTitle(model.getTitle());
                viewHolder.setCity(model.getCity());
                viewHolder.setImage(model.getImageUrl(),getApplicationContext());
                viewHolder.view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent singlePost = new Intent(MainActivity.this,AdDetails.class);
                        singlePost.putExtra("ad_id",ad_id);
                        startActivity(singlePost);
                    }
                });
            }
        };
        recyclerview.setAdapter(firebaseRecyclerAdapter);
    }
    public static class AdsViewHolder extends RecyclerView.ViewHolder{
        View view;
        public AdsViewHolder(View itemView) {
            super(itemView);
            view = itemView;
        }
        public void setTitle(String title){
            TextView adTitle = (TextView) view.findViewById(R.id.title);
            adTitle.setText(title);
        }
        public void setCity(String city){
            TextView adCity = (TextView) view.findViewById(R.id.city);
            adCity.setText(city);
        }
        public void setImage(String image,Context ctx){
            ImageView imageView = (ImageView) view.findViewById(R.id.image);
            Picasso.with(ctx).load(image).into(imageView);
        }
    }
    public void showMenu(){
        authStateListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                if(firebaseAuth.getCurrentUser() == null){
                    navigationView.getMenu().findItem(R.id.register).setVisible(true);
                    navigationView.getMenu().findItem(R.id.login).setVisible(true);
                    navigationView.getMenu().findItem(R.id.logout).setVisible(false);
                    navigationView.getMenu().findItem(R.id.profile).setVisible(false);
                    //get header textviews
                    View header =  navigationView.getHeaderView(0);
                    userHeaderName = header.findViewById(R.id.user_header_fullname);
                    userEmailName =  header.findViewById(R.id.user_header_email);
                    HeaderProfileImage = header.findViewById(R.id.user_header_image);
                    HeaderProfileImage.setVisibility(View.INVISIBLE);
                    userHeaderName.setText("");
                    userEmailName.setText("");
                }else{
                    navigationView.getMenu().findItem(R.id.register).setVisible(false);
                    navigationView.getMenu().findItem(R.id.login).setVisible(false);
                    navigationView.getMenu().findItem(R.id.logout).setVisible(true);
                    navigationView.getMenu().findItem(R.id.profile).setVisible(true);
                    //get header textviews
                    View header =  navigationView.getHeaderView(0);
                    userHeaderName = header.findViewById(R.id.user_header_fullname);
                    userEmailName =  header.findViewById(R.id.user_header_email);
                    HeaderProfileImage = header.findViewById(R.id.user_header_image);
                    db.child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            String fullname = (String) dataSnapshot.child("fullname").getValue();
                            String email = mAuth.getCurrentUser().getEmail();
                            String image = (String) dataSnapshot.child("image_url").getValue();
                            if(image != null) {
                                Picasso.with(MainActivity.this).load(image).into(HeaderProfileImage);
                            }else {
                                HeaderProfileImage.setImageResource(R.drawable.abc56789);
                            }
                            userHeaderName.setText(fullname);
                            userEmailName.setText(email);


                        }
                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
                }
            }
        };
    }

}
                                                        
                                                    

3- كيفاش ن activer onItemClick ديال recycler view

فدابا وخا نكليكي على شي إعلان مغاديش يديني لتفاصيل الإعلان حيت recycler view مكتقبلش ل on click فباش نزيدلها هاد الخاصية كنمشي ل dossier java فيه زيد dossier سميه helpers فيه زيد java class سميها RecyclerViewItemClick فيه غادي نزيدو واحد الكود لي غادي يمكنا باش نزيدو ل on click ل recycler view الكود لي زدنا هو :

                                                        
                                                            package helpers;

import android.support.v7.widget.RecyclerView;
import android.view.View;

import com.example.belasri.hiresell.R;

/**
 * Created by belasri on 17/12/2017.
 */

public class RecyclerViewItemClick {
    private final RecyclerView mRecyclerView;
    private OnItemClickListener mOnItemClickListener;
    private OnItemLongClickListener mOnItemLongClickListener;
    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mOnItemClickListener != null) {
                RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
                mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
            }
        }
    };
    private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            if (mOnItemLongClickListener != null) {
                RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
                mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
            }
            return false;
        }
    };
    private RecyclerView.OnChildAttachStateChangeListener mAttachListener
            = new RecyclerView.OnChildAttachStateChangeListener() {
        @Override
        public void onChildViewAttachedToWindow(View view) {
            if (mOnItemClickListener != null) {
                view.setOnClickListener(mOnClickListener);
            }
            if (mOnItemLongClickListener != null) {
                view.setOnLongClickListener(mOnLongClickListener);
            }
        }

        @Override
        public void onChildViewDetachedFromWindow(View view) {

        }
    };

    private RecyclerViewItemClick(RecyclerView recyclerView) {
        mRecyclerView = recyclerView;
        mRecyclerView.setTag(R.id.item_click_support, this);
        mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
    }

    public static RecyclerViewItemClick addTo(RecyclerView view) {
        RecyclerViewItemClick support = (RecyclerViewItemClick) view.getTag(R.id.item_click_support);
        if (support == null) {
            support = new RecyclerViewItemClick(view);
        }
        return support;
    }

    public static RecyclerViewItemClick removeFrom(RecyclerView view) {
        RecyclerViewItemClick support = (RecyclerViewItemClick) view.getTag(R.id.item_click_support);
        if (support != null) {
            support.detach(view);
        }
        return support;
    }

    public RecyclerViewItemClick setOnItemClickListener(OnItemClickListener listener) {
        mOnItemClickListener = listener;
        return this;
    }

    public RecyclerViewItemClick setOnItemLongClickListener(OnItemLongClickListener listener) {
        mOnItemLongClickListener = listener;
        return this;
    }

    private void detach(RecyclerView view) {
        view.removeOnChildAttachStateChangeListener(mAttachListener);
        view.setTag(R.id.item_click_support, null);
    }

    public interface OnItemClickListener {

        void onItemClicked(RecyclerView recyclerView, int position, View v);
    }

    public interface OnItemLongClickListener {

        void onItemLongClicked(RecyclerView recyclerView, int position, View v);
    }
}
                                                        
                                                    

4- إضافة الملف ids.xml

فمازال خصني نزيد واحد الملف ف dossier res/values سميه ids.xml فيه واحد الكود لي هو :

                                                        
                                                            <?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="item_click_support" type="id" />
</resources>
                                                        
                                                    

5- كيفاش نغير شكل ل icones فل bottom navigation menu

فيلا لاحظتي غادي تلقى فل bottom navigation menu ل icones شوية ممقادينش فباش نخليهم ياخدو نفس المساحة كنمشي ل dossier java ثم helpers فيه زيد واحد ل classe java سميها BottomNavigationViewHelper فيها الكود لي غادي يمكنا باش نقادو ل icones ديال ل bottom navigation menu الكود لي زدنا هو :

                                                        
                                                            package helpers;

import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;

import java.lang.reflect.Field;

/**
 * Created by belasri on 29/11/2017.
 */

public class BottomNavigationViewHelper {
    public static void disableShiftMode(BottomNavigationView view) {
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        try {
            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(menuView, false);
            shiftingMode.setAccessible(false);
            for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
                //noinspection RestrictedApi
                item.setShiftingMode(false);
                // set once again checked value, so view will be updated
                //noinspection RestrictedApi
                item.setChecked(item.getItemData().isChecked());
            }
        } catch (NoSuchFieldException e) {
            Log.e("BNVHelper", "Unable to get shift mode field", e);
        } catch (IllegalAccessException e) {
            Log.e("BNVHelper", "Unable to change value of shift mode", e);
        }
    }
}
                                                        
                                                    

دروس ذات صلة

AN

تطبيق إعلانات بأندرويد و firebase الجزء الأول

فهاد التطبيق الجديد من سلسلة أندرويد غادي نقادو تطبيق ديال إعلانات بحال avito فالمستخدم ديال التطبيق...


AN

تطبيق إعلانات بأندرويد و firebase الجزء الثاني

فهاد الجزء الثاني من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملفات ديالنا غادي نكملو ملف...


AN

تطبيق إعلانات بأندرويد و firebase الجزء الثالت

فهاد الجزء الثالت من تطبيق إعلانات بأندرويد و firebase  غادي نكملو الملفات ديالنا فدبا غادي نزيدو ال...


AN

تطبيق إعلانات بأندرويد و firebase الجزء الخامس

فهاد الجزء الخامس من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملفات لي بقاونا غادي نشوفوا...


AN

تطبيق إعلانات بأندرويد و firebase الجزء السادس

فهاد الجزء السادس من تطبيق إعلانات بأندرويد و firebase غادي نشوفوا كيفاش نزيدو لملفات لي غادي يمكنوا...


AN

تطبيق إعلانات بأندرويد و firebase الجزء السابع

فهاد الجزء السابع من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملفات ديالنا غادي نشوفوا كيفاش ن...


AN

تطبيق إعلانات بأندرويد و firebase الجزء الثامن

فهاد الجزء الثامن من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملفات الخاصة بالبروفايل ديال الم...


AN

تطبيق إعلانات بأندرويد و firebase الجزء التاسع والأخير

فهاد الجزء الأخير من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملفات لي بقاونا فغادي نشوفوا كيف...