简体   繁体   中英

How can i get the 3 textview from recyclerview and pass it to dialogbox

Im new to android programming so can you provide me the right code. this is my code. the data is from sqlite. my problem is . How can i get the 3 textview from recyclerview and pass it to dialogbox when clicked? i finally made dialogbox but i can get only the position of the item i want to get all of the three textview data. please help me.

FragmentMeal.java

package inncharge.poy.madrigal.innchargev1.fragments;


import android.app.Dialog;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import inncharge.poy.madrigal.innchargev1.R;
import inncharge.poy.madrigal.innchargev1.database.DatabaseHelper;
import inncharge.poy.madrigal.innchargev1.adapters.VivzAdapter;


/**
 * A simple {@link Fragment} subclass.
 * Use the {@link FragmentMeal#newInstance} factory method to
 * create an instance of this fragment.
 */
public class FragmentMeal extends Fragment {

    private DatabaseHelper db;
    private RecyclerView recyclerView;
    private VivzAdapter adapter;


    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;



    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment FragmentMeal.
     */
    // TODO: Rename and change types and number of parameters
    public static FragmentMeal newInstance(String param1, String param2) {
        FragmentMeal fragment = new FragmentMeal();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    public FragmentMeal() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }

        db = new DatabaseHelper(getActivity());

    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.fragment_meal, container, false);
        recyclerView = (RecyclerView) view.findViewById(R.id.mealList);
        adapter = new VivzAdapter(getActivity(),db.getMealData());
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {

            @Override


            public void onClick(View view, int postion) {

                final Dialog dialog = new Dialog(getActivity());
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
                dialog.setContentView(R.layout.custom_dialog);
                dialog.show();

                final EditText editText = (EditText)dialog.findViewById(R.id.editText_pin);
                Button submitButton = (Button)dialog.findViewById(R.id.submit_button);
                Button cancelButton = (Button)dialog.findViewById(R.id.cancel_button);

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

                        String text = editText.getText().toString();
                        Toast.makeText(getActivity(), "Pin submitted is : " + text, Toast.LENGTH_SHORT).show();
                        dialog.cancel();

                    }
                });


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

                        dialog.cancel();

                    }
                });

            }

            @Override
            public void onLongClick(View view, int position) {

                Toast.makeText(getActivity(), "onLongClick" + position, Toast.LENGTH_SHORT).show();

            }
        }));

        return view;
    }

    class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

        private GestureDetector gestureDetector;
        private ClickListener clickListener;
        public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener){
            Log.d("VIVZ", "constructor invoked ");
            this.clickListener = clickListener;
            gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){

                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    Log.d("VIVZ","onSingleTapUp " + e);
                    return true;
                }

                @Override
                public void onLongPress(MotionEvent e) {
                    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                    if (child != null && clickListener != null){

                        clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child));

                    }
                    Log.d("VIVZ", "onLongPress " + e);
                }
            });
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

            View child = rv.findChildViewUnder(e.getX(), e.getY());
            if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)){

                clickListener.onClick(child, rv.getChildAdapterPosition(child));

            }
            return false;

        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {
            Log.d("VIVZ","onTouchEvent "+ e);
        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

        }
    }

    public static interface ClickListener {

        public void onClick(View arg1, int arg2);
        public void onLongClick(View view, int position);

    }

}

VivzAdapter.java

package inncharge.poy.madrigal.innchargev1.adapters;

import android.content.ClipData;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Collections;
import java.util.List;

import inncharge.poy.madrigal.innchargev1.R;
import inncharge.poy.madrigal.innchargev1.fragments.FragmentMeal;
import inncharge.poy.madrigal.innchargev1.pojo.Contact;
import inncharge.poy.madrigal.innchargev1.pojo.Information;

/**
 * Created by Madrigal on 7/18/2015.
 */
public class VivzAdapter extends RecyclerView.Adapter<VivzAdapter.MyViewHolder> {

    private Context context;
    private final LayoutInflater inflater;
    List<Contact> data = Collections.emptyList();

    public VivzAdapter(Context context, List<Contact> data){

        this.context=context;
        inflater = LayoutInflater.from(context);
        this.data=data;

    }

    public void delete(int position){
        data.remove(position);
        notifyItemRemoved(position);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.custom_row, parent, false);
        Log.d("VIVZ","onCreateHolder called ");
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        Contact current = data.get(position);
        Log.d("VIVZ", "onBindViewHolder called " + position);
        holder.itemId.setText(String.valueOf(current.getId()));
        holder.title.setText(current.getName());
        holder.email.setText(current.getEmail());

    }

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

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public TextView title;
        public TextView email;
        public TextView itemId;


        public MyViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.listTextName);
            email = (TextView) itemView.findViewById(R.id.listTextUname);
            itemId = (TextView) itemView.findViewById(R.id.listTextId);
        }

        @Override
        public void onClick(View v) {


        }

    }

}

Slidenerd makes some great videos, he helped me a lot as well when I started.

You might want to reconsider what you're trying to do and approach it differently... Why would you want to pass 3 textview from your UI into a dialog? This is going to be painful.

Seems like you're going to have to extend DialogFragment (i'm assuming that's what you're using for a dialog, maybe an alert?). Create a static factory method inside the DialogFragment like this...

public class MyDialog extends DialogFragment {

    private static tv1, tv2, tv3;

    public static MyDialog newInstance(TextView tv1, TextView tv2, TextView tv3){
       MyDialog.tv1 = tv1;
       MyDialog.tv2 = tv2;
       MyDialog.tv3 = tv3;
       return new MyDialog();
    }
}

Once you have this complete, create this dialog fragment inside that onClick method in the ViewHolder class. Instantiate the DialogFragment by doing this...

MyDialog.newInstance(title,email,itemId).show(getFragmentManager(),"dialog_tag");

Like i said before, it's seems sloppy and is probably error prone. There may be a better way of doing this but this is all I can think of off the top of my head. Let me know how it works out for you.. or perhaps revise your question so we can better help you reach a better solution to what you're trying to do.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM