recyclelerview当我点击项目并打开对话框时返回顶部

时间:2018-03-02 15:13:34

标签: android android-recyclerview recycler-adapter recyclerview-layout

当我点击项目时,我可以打开一个对话框,其中点击了该项目的详细信息。但问题是,当我把物品放在上面时,recyclervie会转到顶部然后出现对话框。我希望recyclelerview在出现对话框和解散时保持其位置。

这是适配器。

public class ListaPedidosUsuarioNoExitosos extends RecyclerView.Adapter<ListaPedidosUsuarioNoExitosos.ListaPedidosUsuarioNoExitososViewHolder> {

    private List<Pedido> pedidos=new ArrayList<>();

    public OnItemClickListenerPedidosUsuariosNoExitosos mlistener;
    private Context mContext;

    public void add(Pedido plato){
        pedidos.add(plato);
        notifyItemInserted(pedidos.size()-1);
    }






    public interface OnItemClickListenerPedidosUsuariosNoExitosos {
        void onItemClickedPedidosUsuariosUsuariosNoExitosos(View v);
    }


    @Override
    public ListaPedidosUsuarioNoExitosos.ListaPedidosUsuarioNoExitososViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pedidos_usuario, parent, false);
        ListaPedidosUsuarioNoExitososViewHolder rvMainAdapterViewHolder = new ListaPedidosUsuarioNoExitososViewHolder(view);

        return  rvMainAdapterViewHolder;
    }



    @Override
    public void onBindViewHolder(ListaPedidosUsuarioNoExitosos.ListaPedidosUsuarioNoExitososViewHolder holder, int position) {



        Pedido pediditos = pedidos.get(position);

        String fechaaa= pediditos.getFechaPedido().toString();
        String fechaPrimeraParte=fechaaa.substring(0,16);
        String fechaSegundaParte=fechaaa.substring(20,21);
        String fechaTerceraParte=fechaaa.substring(21);
        String fechaFormateada=fechaPrimeraParte+" "+fechaSegundaParte+fechaTerceraParte;


        holder.idPedido.setText(pediditos.getId_usuario().toString());//el id_usuario sera el idPedido


        holder.idChef.setText(pediditos.getId_plato().toString());//este sera el id del chef
        holder.idUserChef.setText(pediditos.getId_usuarioChef().toString());//este sera el id del chef

        holder.nombreplato.setText(pediditos.getNombrePlato().toString());
        holder.nombreChef.setText("Chef "+pediditos.getNombreComensal().toString());//nombre comensal sera el nombre del chef

        Double preciodob=Double.valueOf(pediditos.getPrecioPlato().toString());
        Integer precioformateado=preciodob.intValue();
        String precioFinal=precioformateado.toString();
        holder.precio.setText(precioFinal);//este precioplato en realidad es el total

        holder.fecha.setText(fechaFormateada);
        holder.servicioSolicitado.setText(pediditos.getServicioSolicitado().toString());

        //el mnombre plato es un booleano que devueltre true si el pedido esta cancelado o false si es que no
        if(pediditos.getNombrePlato()=="true")
        {
            //este estadoPedido es solo para mostrar el estado en un string
            holder.estadoPedido.setText(mContext.getString(R.string.Cancelado));
            holder.estadoPedido.setVisibility(View.VISIBLE);
            holder.estadoPedido.setTextColor(Color.RED);
        }
        else
        {
            //esta condicion es si el pedido a sido tomado
            if (pediditos.getPedidoTomado() == "true") {

                holder.estadoPedido.setVisibility(View.VISIBLE);
                holder.estadoPedido.setTextColor(Color.argb(255,57,105,43));
                holder.estadoPedido.setText(mContext.getString(R.string.Calificar));
            } else {

                if (pediditos.getPedidoEnviadoAlChef() == "false")
                {
                    holder.estadoPedido.setVisibility(View.VISIBLE);
                    holder.estadoPedido.setTextColor(Color.RED);
                    holder.estadoPedido.setText(mContext.getString(R.string.Enviar_pedido));
                }
                else {

                    holder.estadoPedido.setVisibility(View.VISIBLE);
                    holder.estadoPedido.setTextColor(Color.argb(255,57,105,43));
                    holder.estadoPedido.setText(mContext.getString(R.string.Esperando_al_chef));
                }
            }
        }
    }

    @Override
    public int getItemCount() {
        return pedidos.size();
    }


     class ListaPedidosUsuarioNoExitososViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{//}, View.OnLongClickListener{
        TextView idPedido,idChef,idUserChef,nombreplato,nombreChef,precio,fecha,servicioSolicitado,estadoPedido;


        public ListaPedidosUsuarioNoExitososViewHolder   (View v){
            super(v);
            idPedido=(TextView) v.findViewById(R.id.tv_id_pedido_PedidosUsuario);
            idChef=(TextView) v.findViewById(R.id.tv_id_chef_PedidosUsuario);
            idUserChef=(TextView) v.findViewById(R.id.tv_id_Userchef_PedidosUsuario);
            nombreplato=(TextView) v.findViewById(R.id.tv_nombrePlato_PedidosUsuario);
            nombreChef=(TextView) v.findViewById(R.id.tv_nombreChef_PedidosUsuario);
            precio=(TextView) v.findViewById(R.id.tv_precioPlato_PedidosUsuario);
            fecha=(TextView) v.findViewById(R.id.tv_fechapedido_PedidosUsuario);
            servicioSolicitado=(TextView) v.findViewById(R.id.tv_servicioSolicitado_PedidosUsuario);
            estadoPedido=(TextView)v.findViewById(R.id.tv_estadoPedido_PedidosUsuario);

            //v.setOnLongClickListener(this);
            v.setOnClickListener(this);
        }





         @Override
         public void onClick(View v) {



             SharedPreferences preferencias=v.getContext().getSharedPreferences("PedidoUsuarioNoExitoso",Context.MODE_PRIVATE);
             SharedPreferences.Editor editor=preferencias.edit();
             editor.putInt("idpedido", Integer.parseInt(idPedido.getText().toString()) );
             editor.putInt("idchefPedido", Integer.parseInt(idChef.getText().toString()) );
             editor.putString("nombrePlato",nombreplato.getText().toString() );
             editor.putString("totalPedido",precio.getText().toString() );
             editor.putString("estadoPedido",estadoPedido.getText().toString() );
             editor.putString("nombreChef",nombreChef.getText().toString() );
             editor.putInt("iduserchefPedido", Integer.parseInt(idUserChef.getText().toString()) );
             editor.commit();


             mlistener.onItemClickedPedidosUsuariosUsuariosNoExitosos(v);


         }
     }



    public ListaPedidosUsuarioNoExitosos(OnItemClickListenerPedidosUsuariosNoExitosos listener, Context context, ArrayList<Pedido> pedidos){
        this.pedidos=pedidos;
        this.mlistener=listener;
        this.mContext=context;
    }


}

这是活动

public class PedidosUsuarioActivity extends AppCompatActivity implements
        ListaPedidosUsuarioNoExitosos.OnItemClickListenerPedidosUsuariosNoExitosos
{
   RecyclerView recyclerviewPedidosUsuarioNoExitosos;
    private ListaPedidosUsuarioNoExitosos adapter;

    private  ListaPedidosUsuarioNoExitosos.OnItemClickListenerPedidosUsuariosNoExitosos  mlistener;

    @Override
    public void onItemClickedPedidosUsuariosUsuariosNoExitosos(View v) {

        DetallePedidoUsuario df= new DetallePedidoUsuario();
        df.show(getSupportFragmentManager(), "Dialog");

    }


 @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menupedidos, menu);

        SharedPreferences prefe = getSharedPreferences("DatosPreferenciales", Context.MODE_APPEND);
        String telef = prefe.getString("telefono_preferente", "");

        if(telef.equals(""))
        {
            menu.findItem(R.id.action_actualizaTelefono).setVisible(false);
        }
        else
        {
            menu.findItem(R.id.action_registraTelefono).setVisible(false);
        }

        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        int id = item.getItemId();

        //si le doy a la opcion limpiar historial
        if (id == R.id.action_limpiarHistorial) {

            //tarea asincrona para borrar historial de pedidos
            WS_LimpiaHistorialPedidosUsuario task = new WS_LimpiaHistorialPedidosUsuario();
            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

            //le doy null como adpatador el recyclerview
           // recyclerviewPedidosUsuarioNoExitosos.setAdapter(null);
        }
        if (id == R.id.action_actualizaTelefono) {

            EditarTelefonoUsuario df= new EditarTelefonoUsuario();
            df.show(getSupportFragmentManager(), "Dialog");

        }
        if (id == R.id.action_registraTelefono) {

            EditarTelefonoUsuario df= new EditarTelefonoUsuario();
            df.show(getSupportFragmentManager(), "Dialog");
        }

        return super.onOptionsItemSelected(item);
    }


 @Override
    protected void onStart() {
        super.onStart();

        actualizapedidoscada15segundos();
    }


  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.pedidos_usuario);

        //inicializo el toolbar y atras button
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_PedidosUsuarioNoExitosos);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        //inicializo el recyclerview
        recyclerviewPedidosUsuarioNoExitosos=(RecyclerView) findViewById(R.id.rv_pedidosUsuario);
        recyclerviewPedidosUsuarioNoExitosos.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

       // noTienePedidos=(TextView)findViewById(R.id.tv_noTienePedidos);


        //listeners de click  de la lista de pedidos
        mlistener=this;

        SharedPreferences preferencias=getSharedPreferences("AgregaPlato",Context.MODE_PRIVATE);
        SharedPreferences.Editor editor=preferencias.edit();
        editor.putBoolean("BorroBotonNuevoPedido", false );
        editor.putBoolean("AgregaASoloUnPedido", false );
        editor.commit();


        if(Conexion.isConnectedToInternet(getApplicationContext())==true)
        {
            WS_PedidosUsuarioNoExitosos task= new WS_PedidosUsuarioNoExitosos();
            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }
        else
        {
            Toast toast = Toast.makeText(getApplicationContext(),getApplicationContext().getString(R.string.No_esta_conectado_a_Internet), Toast.LENGTH_SHORT);
            toast.show();
        }



    }


}

这是clic

时打开的对话框
public class DetallePedidoUsuario  extends DialogFragment implements
        ListaDetallePedidos.OnItemClickListenerDetallePedidos,
        ListaPedidosUsuarioNoExitosos.OnItemClickListenerPedidosUsuariosNoExitosos
{

     //evento click de la lista de pedidos
    @Override
    public void onItemClickedPedidosUsuariosUsuariosNoExitosos(View v) {

      //  POSICION=position;

        DetallePedidoUsuario df= new DetallePedidoUsuario();
        df.show(getFragmentManager(), "Dialog");
    }


   @Override
    public void onStart()
    {
        super.onStart();
        Dialog dialog = getDialog();
        if (dialog != null)
        {

            //numero de pixeles que tendra de ancho
            // int width = 700;
            int width=ViewGroup.LayoutParams.MATCH_PARENT;

            //la altura se ajustara al contenido
            int height = ViewGroup.LayoutParams.WRAP_CONTENT;

            //se lo asigno a mi dialogfragment
            dialog.getWindow().setLayout(width, height);
        }
    }

 @Override
    public Dialog onCreateDialog (Bundle savedInstanceState) {

        View view = getActivity().getLayoutInflater().inflate(R.layout.detalle_pedido_usuario, new LinearLayout(getActivity()), false);

        //inicializo los controles
        nombreChef=(Button)view.findViewById(R.id.tv_NombreChef_DetallePedidoUsuario);
        totalPedido=(TextView)view.findViewById(R.id.tv_Total_DetallePedidoUsuario);
        cancelaPedido=(Button)view.findViewById(R.id.btn_Cancelar_DetallePedidoUsuario);
        calificar=(Button)view.findViewById(R.id.btn_Calificar_DetallePedidoUsuario);
        enviarPedido=(Button)view.findViewById(R.id.btn_EnviarPedido_DetallePedidoUsuario);

        //inicializo la lista de detalle de pedidos
        recyclerviewDetallePedidos=(RecyclerView) view.findViewById(R.id.rv_detallePedidoUsuario);
        recyclerviewDetallePedidos.setLayoutManager(new LinearLayoutManager(this.getActivity().getApplicationContext()));

        //inicializo la lista de pedidos (cargo esta lista denuevo xq al salir del dialog vuelva a refrescar la lista)
        recyclerviewPedidosUsuarioNoExitosos=(RecyclerView) getActivity().findViewById(R.id.rv_pedidosUsuario);
        recyclerviewPedidosUsuarioNoExitosos.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));


        //tarea asincrona que lista el detalle del pedido
        WS_ListaDetallePedidos task=new WS_ListaDetallePedidos();
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);


        SharedPreferences prefe=getActivity().getSharedPreferences("DatosPreferenciales", Context.MODE_PRIVATE);
        NOMBREUSUARIO=prefe.getString("nombre_preferente","");
        IDUSUARIO=prefe.getInt("id_preferente",0);


        SharedPreferences prefer=getActivity().getSharedPreferences("PedidoUsuarioNoExitoso", Context.MODE_PRIVATE);
         EstadoPedido=prefer.getString("estadoPedido","");
        String NombreChef=prefer.getString("nombreChef","");
        String TotalPedido=prefer.getString("totalPedido","");

       // TOTAL=Double.parseDouble(TotalPedido);
       // totalPedido.setText("TOTAL: /S. "+TOTAL.toString());
        totalPedido.setText("TOTAL: "+getContext().getString(R.string.Dinero)+TotalPedido);

        if(EstadoPedido.equals(getContext().getString(R.string.Calificar)))

        {
            enviarPedido.setVisibility(View.GONE);
            cancelaPedido.setVisibility(View.GONE);
            calificar.setVisibility(View.VISIBLE);
            nombreChef.setVisibility(View.GONE);
        }
        else
        {
            if(EstadoPedido.equals(getContext().getString(R.string.Cancelado)))
            {
                enviarPedido.setVisibility(View.GONE);
                cancelaPedido.setVisibility(View.GONE);
                calificar.setVisibility(View.GONE);
               // totalPedido.setVisibility(View.GONE);
                nombreChef.setVisibility(View.GONE);
            }
            else
            {
                if(EstadoPedido.equals(getContext().getString(R.string.Enviar_pedido)))
                {
                    enviarPedido.setVisibility(View.VISIBLE);
                    cancelaPedido.setVisibility(View.VISIBLE);
                    calificar.setVisibility(View.GONE);
                }
                else {
                    enviarPedido.setVisibility(View.GONE);
                    cancelaPedido.setVisibility(View.VISIBLE);
                    calificar.setVisibility(View.GONE);
                    nombreChef.setVisibility(View.GONE);
                }

            }
        }




        calificar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //aki hacer un intent para un dialog fragment que tenga un rating bar para calificar-
                CalificacionPedido df= new CalificacionPedido();
                df.show(getFragmentManager(), "Dialog");
            }
        });




        cancelaPedido.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                CUERPO=NOMBREUSUARIO+" "+getContext().getString(R.string.A_cancelado_el_pedido);
                TITULO=getContext().getString(R.string.Pedido_cancelado);

                WS_UsuarioCancelaPedido task=new WS_UsuarioCancelaPedido();
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

              //  Toast.makeText(getContext(), "Pedido cancelado", Toast.LENGTH_SHORT).show();
            }
        });





        enviarPedido.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //aca setear enviadoAlChef=1
                CUERPO=NOMBREUSUARIO+" "+getContext().getString(R.string.A_realizado_un_pedido);
                TITULO=getContext().getString(R.string.Nuevo_pedido);

                WS_UsuarioEnviaPedidoAlChef task = new WS_UsuarioEnviaPedidoAlChef();
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
            }
        });





        //muestro del nombre del chef y su evento click
       // nombreChef.setText(NombreChef);
        nombreChef.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //que me lleve al perfilchef de los pedidos del usuario
                SharedPreferences preferencias=v.getContext().getSharedPreferences("AgregaPlato",Context.MODE_PRIVATE);
                SharedPreferences.Editor editor=preferencias.edit();
                editor.putBoolean("BorroBotonNuevoPedido", true );
                editor.putBoolean("AgregaASoloUnPedido", true );
                editor.commit();

                Intent intento = new Intent(getActivity().getApplicationContext(), PerfilChefPedidosUsuarioActivity.class);
                startActivity(intento);
            }
        });

        //listeners del evento click de las listas
        m_listener=this;
        milistener=this;

        Dialog builder = new Dialog(getActivity());
        builder.requestWindowFeature(Window.FEATURE_NO_TITLE);


        builder.setContentView(view);
        return  builder;

    }



}

1 个答案:

答案 0 :(得分:0)

我不完全确定这是您的所有代码,但我的猜测是,当您关闭对话框时,您的活动正在重新初始化,因此您的recyclerview适配器会一次又一次地设置,这就是您被移动的原因在列表的顶部,因为它重新初始化,但这只是一个假设。

查看并告诉我