【问题标题】:How to open a details activity when an item is clicked in Firebase RecyclerView Cardview在 Firebase RecyclerView Cardview 中单击项目时如何打开详细信息活动
【发布时间】:2017-08-01 21:46:32
【问题描述】:

我想在 recyclerView 中实现 Onclick 项目要打开新活动,我可以将数据从一个活动传递到另一个活动,但在代码中无法确定在哪里实现 onclick onclicklistener 如果有人可以免费帮助我编辑并给出详细信息.class
由于我是第一次从 firebase 获取数据,因此我将不胜感激任何帮助。

import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
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.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;
import android.widget.TextView;

import com.dekhou.provissionstore.model.Movie;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.squareup.picasso.Picasso;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {


    private FloatingActionButton fab;


    ScaleAnimation shrinkAnim;
    private RecyclerView mRecyclerView;
    private StaggeredGridLayoutManager mLayoutManager;
    private TextView tvNoMovies,tvNoMovies1;
    private Context context;

    //Getting reference to Firebase Database
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference mDatabaseReference = database.getReference();

    private static final String userId = "01";



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        //Initializing our Recyclerview
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        tvNoMovies = (TextView) findViewById(R.id.tv_no_movies);
        //tvNoMovies1 = (TextView) findViewById(R.id.addresstxt);

        //scale animation to shrink floating actionbar
        shrinkAnim = new ScaleAnimation(1.15f, 0f, 1.15f, 0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

        if (mRecyclerView != null) {
            //to enable optimization of recyclerview
            mRecyclerView.setHasFixedSize(true);
        }
        //using staggered grid pattern in recyclerview
        mLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(mLayoutManager);

        //Say Hello to our new FirebaseUI android Element, i.e., FirebaseRecyclerAdapter
        FirebaseRecyclerAdapter<Movie,MovieViewHolder> adapter = new FirebaseRecyclerAdapter<Movie, MovieViewHolder>(
                Movie.class,
                R.layout.movie_board_item,
                MovieViewHolder.class,
                //referencing the node where we want the database to store the data from our Object
                mDatabaseReference.child("users").child(userId).child("shops").getRef()
        ) {
            @Override
            protected void populateViewHolder(MovieViewHolder viewHolder, final Movie model, final int position) {
                if(tvNoMovies.getVisibility()== View.VISIBLE){
                    tvNoMovies.setVisibility(View.GONE);
                }
                viewHolder.tvMovieName.setText(model.getMovieName());
                viewHolder.address.setText(model.getAddress());
                viewHolder.phone.setText(model.getPhone());
                viewHolder.lit.setText(model.getLit());
                viewHolder.lon.setText(model.getLon());
                Picasso.with(MainActivity.this).load(model.getMoviePoster()).into(viewHolder.ivMoviePoster);


// all your stuff

            }
        };

        mRecyclerView.setAdapter(adapter);


        fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.frame_container, new AddMovieFragment())
                        .addToBackStack(null)
                        .commit();
                //animation being used to make floating actionbar disappear
                shrinkAnim.setDuration(400);
                fab.setAnimation(shrinkAnim);
                shrinkAnim.start();
                shrinkAnim.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        //changing floating actionbar visibility to gone on animation end
                        fab.setVisibility(View.GONE);
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {


                    }
                });

            }
        });

    }


    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.menu_map) {

            Intent intent = new Intent(this, MapsActivity.class);
            this.startActivity(intent);
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_slideshow) {
            Intent cinemaIntent = new Intent(this, MapsActivity.class);
            startActivity(cinemaIntent);
        } else if (id == R.id.nav_manage) {
            Intent cinemaIntent = new Intent(this, Get_Data.class);
            startActivity(cinemaIntent);
        } else if (id == R.id.nav_share) {
            try {
                //try to open page in facebook native app.
                String uri = "fb://page/" + "293069792077";    //Cutsom URL
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
                startActivity(intent);
            }catch (ActivityNotFoundException ex){
                //facebook native app isn't available, use browser.
                String uri = "http://touch.facebook.com/pages/x/" + "293069792077";  //Normal URL
                Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
                startActivity(i);
            }
        } else if (id == R.id.nav_send) {

            Intent cinemaIntent = new Intent(this, About_Us.class);
            startActivity(cinemaIntent);

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    //ViewHolder for our Firebase UI
    public static class MovieViewHolder extends RecyclerView.ViewHolder{

        TextView tvMovieName,address,phone,lit,lon;

        ImageView ivMoviePoster;


        public MovieViewHolder(View v) {
            super(v);
            tvMovieName = (TextView) v.findViewById(R.id.tv_name);
            address = (TextView) v.findViewById(R.id.address1);
            phone = (TextView) v.findViewById(R.id.tv_phone);
            lit = (TextView) v.findViewById(R.id.geo);
            lon = (TextView) v.findViewById(R.id.geo2);


            ivMoviePoster = (ImageView) v.findViewById(R.id.iv_movie_poster);




        }





    }


}

【问题讨论】:

    标签: java android firebase firebase-realtime-database android-recyclerview


    【解决方案1】:

    在 populateViewHolder 中为您的 ViewHolder 添加 onClickListener 到 itemView 并启动 Activity。像下面的例子。

        @Override
        protected void populateViewHolder(MovieViewHolder viewHolder, final Movie model, final int position) {
            if(tvNoMovies.getVisibility()== View.VISIBLE){
                tvNoMovies.setVisibility(View.GONE);
            }
            viewHolder.tvMovieName.setText(model.getMovieName());
            viewHolder.address.setText(model.getAddress());
            viewHolder.phone.setText(model.getPhone());
            viewHolder.lit.setText(model.getLit());
            viewHolder.lon.setText(model.getLon());
            Picasso.with(MainActivity.this).load(model.getMoviePoster()).into(viewHolder.ivMoviePoster);
    
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, DetailActivity.class);
                    //intent.putExtra("model", model);
                    intent.putExtra("latitude", model.getLit());
                    intent.putExtra("longitude", model.getLon());
    
                    startActivity(intent);
                }
            });
    // all your stuff
    
        }
    

    【讨论】:

    • intent.putExtra("model", model);是把所有数据都传给DetailActivity.class吗?
    • 是的,它会发送模型对象,不要忘记将你的电影对象设置为可序列化或可打包。
    • 如果我只想将 Lit=latitude 和 Lon=longitude 传递给 DetailActivity.class 以显示单击项目的位置
    • 我希望这个图像按钮打开电话应用程序并获取电话号码给拨号器我有这个代码但是当点击图像按钮时应用程序崩溃。 viewHolder.imageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse(model.getPhone())); } });
    • 添加您的崩溃日志。
    【解决方案2】:

    试试这个在你的populateViewHolder中添加onClickListener就像这样

    @Override
            protected void populateViewHolder(MovieViewHolder viewHolder, final Movie model, final int position) {
                if(tvNoMovies.getVisibility()== View.VISIBLE){
                    tvNoMovies.setVisibility(View.GONE);
                }
                viewHolder.tvMovieName.setText(model.getMovieName());
                viewHolder.address.setText(model.getAddress());
                viewHolder.phone.setText(model.getPhone());
                viewHolder.lit.setText(model.getLit());
                viewHolder.lon.setText(model.getLon());
                Picasso.with(MainActivity.this).load(model.getMoviePoster()).into(viewHolder.ivMoviePoster);
             viewHolder.tvMovieName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, DetailActivity.class);
                 startActivity(intent);
            }
        });
    
            }
    

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2016-04-21
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多