Android: открытие PDF-файлов из RecyclerView - PullRequest
0 голосов
/ 25 января 2019

enter image description here

Название вопроса не полностью объясняет мою проблему, поэтому позвольте мне остановиться подробнее. У меня есть приложение, которое анализирует данные JSON из Google Civic API в виде переработчика. Одно конкретное поле - это TextView, в котором URL-адрес PDF хранится в строке. Как настроить TextView так, чтобы он был кликабелен и открывал PDF предпочтительно в приложении Я искал решения и пытался использовать WebView и PDFReader среди других, но я не смог найти ни одного решения, в котором упоминалось бы, как это сделать, из обзора переработчика, поэтому я не уверен, где разместить этот код. Так как я нажимаю на элемент в программе recyclerView, я подумал, что, возможно, мне понадобится добавить код в адаптере переработчика просмотра вместо основного класса.

Вот код для основного класса: Этот класс обрабатывает анализ JSON

    public class VoterInformation extends AppCompatActivity  {
    private static final String url = "https://www.googleapis.com/civicinfo/v2/voterinfo?address=2613+Irvington+Ave+San+Bernardino+CA+92407&electionId=2000&officialOnly=false&returnAllAvailableData=false&fields=contests(referendumBallotResponses%2CreferendumBrief%2CreferendumConStatement%2CreferendumEffectOfAbstain%2CreferendumPassageThreshold%2CreferendumProStatement%2CreferendumSubtitle%2CreferendumText%2CreferendumTitle%2CreferendumUrl)&key=AIzaSyB1B5mEKHK8PHDiNcGQ5ZU3fPIH9KWxAcQ";
    private TextView refTitle, refSub, refUrl;
    private LinearLayoutManager linearLayoutManager;
    private List<Refs> refList;
    private RecyclerView myrv;
    private RecyclerView.Adapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_voter_information);

        refTitle = findViewById(R.id.ref_title);         //Initialize TextViews
        refSub = findViewById(R.id.ref_sub);


        myrv = findViewById(R.id.ref_rv);        //Initialize recycler view
        refList = new ArrayList<>();
        adapter = new RefRvAdapter(refList, getApplicationContext());

        linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

        myrv.setHasFixedSize(true);
        myrv.setLayoutManager(linearLayoutManager);
        myrv.setAdapter(adapter);

        TextView pdf_url = findViewById(R.id.ref_url);
        pdf_url.setClickable(true);
        pdf_url.setMovementMethod(LinkMovementMethod.getInstance());


        getData();

    }



    private void getData(){
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        progressDialog.show();

        StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                progressDialog.dismiss();
                try{
                    JSONObject jsonObject = new JSONObject(response);
                    JSONArray array = jsonObject.getJSONArray("contests");
                    String pdf_url = array.getJSONObject(0).getString("referendumUrl") ;
                    for(int i = 0; i < array.length(); i++){
                        JSONObject jo = array.getJSONObject(i);
                        Refs refs = new Refs(jo.getString("referendumTitle"),
                                jo.getString("referendumSubtitle"),
                                jo.getString("referendumUrl"));
                        refList.add(refs);
                    }
                    adapter = new RefRvAdapter(refList, getApplicationContext());
                    myrv.setAdapter(adapter);

                } catch(JSONException e){
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener(){
            @Override
            public void onErrorResponse(VolleyError error){
                Log.e("Volley", error.toString());
                progressDialog.dismiss();
            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);

    }


}

Вот мой код для класса адаптера:

public class  RefRvAdapter extends RecyclerView.Adapter<RefRvAdapter.MyViewHolder>{
    private Context context;
    private List<Refs> refsList;

    public RefRvAdapter(){}

    public RefRvAdapter(List<Refs> refList, Context context){
        this.refsList = refList;
        this.context = context;
    }
    @NonNull
    @Override
    public RefRvAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view;
        LayoutInflater mInflater = LayoutInflater.from(context);
        view = mInflater.inflate(R.layout.ref_card, viewGroup, false);
        final MyViewHolder viewHolder = new MyViewHolder(view);
        viewHolder.view_containers.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent (context, SingleReferendum.class);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.putExtra("referendumTitle", refsList.get(viewHolder.getAdapterPosition()).getRefTitle());
                i.putExtra("referendumSubtitle", refsList.get(viewHolder.getAdapterPosition()).getRefSub());
                i.putExtra("referendumUrl", refsList.get(viewHolder.getAdapterPosition()).getRefUrl());

                context.startActivity(i);
            }
        });
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RefRvAdapter.MyViewHolder myViewHolder, int i) {
        myViewHolder.refTitle.setText(refsList.get(i).getRefTitle());
        myViewHolder.refSub.setText(refsList.get(i).getRefSub());
        myViewHolder.refUrl.setText(refsList.get(i).getRefUrl());

    }

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


    public static class MyViewHolder extends RecyclerView.ViewHolder{
        TextView refTitle, refSub, refUrl;
        LinearLayout view_containers;
        public MyViewHolder(View itemView){
            super(itemView);
            refTitle = itemView.findViewById(R.id.ref_title);
            refSub = itemView.findViewById(R.id.ref_sub);
            refUrl = itemView.findViewById(R.id.ref_url);
            view_containers = itemView.findViewById(R.id.view_container_ref);

        }
    }
}

Приложение анализирует все данные просто отлично. Я просто хочу сделать URL кликабельным. Когда пользователь щелкает по нему, открывается PDF. Добавлять ли код в класс адаптера RecyclerView или в основной вид деятельности?

ОТВЕТ: Отредактируйте метод onBindViewHolder следующим образом.

@Override
    public void onBindViewHolder(@NonNull final RefRvAdapter.MyViewHolder myViewHolder, int i) {
        myViewHolder.refTitle.setText(refsList.get(i).getRefTitle());
        myViewHolder.refSub.setText(refsList.get(i).getRefSub());
        myViewHolder.refUrl.setText(refsList.get(i).getRefUrl());
        myViewHolder.view_containers.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent (context, SingleReferendum.class);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.putExtra("referendumTitle", refsList.get(myViewHolder.getAdapterPosition()).getRefTitle());
                i.putExtra("referendumSubtitle", refsList.get(myViewHolder.getAdapterPosition()).getRefSub());
                i.putExtra("referendumUrl", refsList.get(myViewHolder.getAdapterPosition()).getRefUrl());

                context.startActivity(i);
            }
        });

        myViewHolder.refUrl.setOnClickListener(new View.OnClickListener(){
            @Override   //handle pdf clicks
            public void onClick(View view) {
                String refUrl = refsList.get(myViewHolder.getAdapterPosition()).getRefUrl();
                Intent intent = new Intent (Intent.ACTION_VIEW, Uri.parse(refUrl));
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        });

    }

1 Ответ

0 голосов
/ 25 января 2019

Если я не понял, что вы имеете в виду, просто измените методы: onCreateViewHolder и onBindViewHolder на:

@NonNull
@Override
public RefRvAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view;
    LayoutInflater mInflater = LayoutInflater.from(context);
    view = mInflater.inflate(R.layout.ref_card, viewGroup, false);
    final MyViewHolder viewHolder = new MyViewHolder(view);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RefRvAdapter.MyViewHolder myViewHolder, int i) {
    myViewHolder.refTitle.setText(refsList.get(i).getRefTitle());
    myViewHolder.refSub.setText(refsList.get(i).getRefSub());
    myViewHolder.refUrl.setText(refsList.get(i).getRefUrl());
    myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent (context, SingleReferendum.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            i.putExtra("referendumTitle", refsList.get(myViewHolder.getAdapterPosition()).getRefTitle());
            i.putExtra("referendumSubtitle", refsList.get(myViewHolder.getAdapterPosition()).getRefSub());
            i.putExtra("referendumUrl", refsList.get(myViewHolder.getAdapterPosition()).getRefUrl());

            context.startActivity(i);
        }
    }
    myViewHolder.refUrl.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String refUrl = refsList.get(myViewHolder.getAdapterPosition()).getRefUrl();
            //open pdf here.
        }
    });
}

Попробуйте и обратная связь, если все в порядке.

...