【问题标题】:Display a fragment when an item in a listview is clicked单击列表视图中的项目时显示片段
【发布时间】:2014-08-14 07:49:11
【问题描述】:

我在从 JSON 获取数据的片段类中有一个列表视图。到目前为止,我能够在列表视图中显示数据。 (这里的数据是新闻项目)。我想在列表视图中单击特定新闻时显示新闻的详细页面。

例如:Listview 只包含新闻的标题和图片。单击该列表视图时,它应该显示该特定新闻片段的详细版本。我该怎么做?

这是具有 Listview 的片段类。

package com.fortuna.cinemalk;

import java.util.ArrayList;

import android.app.Activity;
import android.app.FragmentManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ListView;
import android.content.Intent;
import android.widget.AdapterView;



import com.fortuna.cinemalk.adapter.LazyAdapter;
import com.fortuna.cinemalk.model.BaseElement;
import com.fortuna.cinemalk.service.CommonVariable;
import com.fortuna.cinemalk.service.JSONServices;
import com.fortuna.cinemalk.util.Element;

public class NewsFramgment extends Fragment {

    private GridView gridView;
    private ListView listView;

    private ArrayList<BaseElement> News;
    private LazyAdapter adapter;
    private Activity activity;
    private CommonVariable commonVariable;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.news_fragment, container,
                false);

        activity = this.getActivity();

        commonVariable = (CommonVariable) activity.getApplication();

        //gridView = (GridView) view.findViewById(R.id.gridView2);
        listView = (ListView) view.findViewById(R.id.list);


        listView.setOnItemClickListener(new OnItemClickListener() {
               public void onItemClick(AdapterView<?> parent, View v,
                 int position, long id) {


              android.support.v4.app.Fragment detail = new NewsDetailFragment();
              android.support.v4.app.FragmentManager fragmentManager = getFragmentManager();
              fragmentManager.beginTransaction().add(R.id.content_frame, detail).addToBackStack("back").commit();
               }
              });



            new BackGround().execute();

        return view;
    }


public class BackGround extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            News = JSONServices.getNewsDescription();
            return null;
        } 



        @Override
        /* check again */
        protected void onPostExecute(Void result) {

            commonVariable.setNewsDescription(News);

            adapter = new LazyAdapter(News, activity,Element.NEWS_LIST.getType());

            listView.setAdapter(adapter);

            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }

    }


}

在代码中,您会注意到,当单击某个项目时,它会移动到 NewsDetailFragment。这就是我现在要编写的课程。

PS:我的 JSON 已经包含了所有细节,包括标题、图片、描述......

更新:: 这是我的 NewsDetailFragment 类。它一次显示所有新闻,而不是我点击的新闻。

package com.fortuna.cinemalk;

import java.util.ArrayList;

import android.app.Activity;
import android.app.FragmentManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ListAdapter;
import android.content.Intent;
import android.widget.AdapterView;



import com.fortuna.cinemalk.adapter.LazyAdapter;
import com.fortuna.cinemalk.model.BaseElement;
import com.fortuna.cinemalk.service.CommonVariable;
import com.fortuna.cinemalk.service.JSONServices;
import com.fortuna.cinemalk.util.Element;

public class NewsDetailFragment extends Fragment {

    private GridView gridView;
    private View view1;

    private ArrayList<BaseElement> newsdetail;
    private LazyAdapter adapter;
    private Activity activity;
    private CommonVariable commonVariable;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.newsdetail_fragment, container,
                false);

        activity = this.getActivity();

        commonVariable = (CommonVariable) activity.getApplication();

        view1 = (View) view.findViewById(R.id.list);


        /*gridView.setOnItemClickListener(new OnItemClickListener() {
               public void onItemClick(AdapterView<?> parent, View v,
                 int position, long id) {


              android.support.v4.app.Fragment detail = new TheaterDetailFragment();
              android.support.v4.app.FragmentManager fragmentManager = getFragmentManager();
              fragmentManager.beginTransaction().add(R.id.content_frame, detail).addToBackStack("back").commit();
               }
              }); */



            new BackGround().execute();

        return view;
    }


public class BackGround extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            newsdetail = JSONServices.getNewsDescription();
            return null;
        } 



        @Override
        /* check again */
        protected void onPostExecute(Void result) {

            commonVariable.setTheater(newsdetail);

            adapter = new LazyAdapter(newsdetail, activity,Element.NEWS_DETAIL.getType());

            ((AdapterView<ListAdapter>) view1).setAdapter(adapter);

            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }

    }


}

【问题讨论】:

  • 只需传递您在列表中使用的索引并通过捆绑发送它并将NewSegment替换为DetailSegment。简单
  • 请您解释一下。我是安卓新手
  • 请检查编辑

标签: android json android-fragments android-listview


【解决方案1】:

你可以使用以下

FragmentTransaction fragmentTransaction = getSupportFragmentManager()
                .beginTransaction();
Fragment profileFragment = new MovieDetailFragment();//the fragment you want to show
profileFragment.setArguments(bundle);
fragmentTransaction
    .replace(R.id.content_frame, profileFragment);//R.id.content_frame is the layout you want to replace
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

编辑

FragmentTransaction 用于执行添加或删除片段之类的操作,即当您替换/更改现有布局时,我们执行此类事务以替换片段。 Bundles 是最方便的工具,用于在配置更改时保存数据更改或将数据从一个活动传递到另一个活动或在片段之间传递数据。Fragments 阅读此内容。

对于link1link2docs。捆绑包非常容易理解。

希望编辑有所帮助。

【讨论】:

    【解决方案2】:

    我是这样做的……

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View v=inflater.inflate(R.layout.frag_for_accsummary,container, false);
           final FragmentTransaction ft=    getFragmentManager().beginTransaction();
    
    
          //geting resources
        Resources res=getActivity().getResources();
        title=res.getStringArray(R.array.title);
            // TODO Auto-generated method stub
    
        ListView l=(ListView)v.findViewById(R.id.list);
        MyAadapter m=new MyAadapter(getActivity(),R.layout.singlerow, title, icon);//custom adapter
        //title--> array of text to be shown on list    icon-->  array of images to be shown on list     R.layout.singlerow--> tells how single row should appear in list
        l.setAdapter(m);
    
        l.setOnItemClickListener(new OnItemClickListener() {
    
            public void onItemClick(AdapterView<?> parent, View v, int position,
                    long id) {
                // TODO Auto-generated method stub
                Log.i("in seton","setonclick");
    
                switch(position){
    
                case 0: 
                    AccSummary frag0=new AccSummary();
    
                bun.putString("uname",uname);
                bun.putString("sessid",sessid);
                bun.putString("custid",custid1);
                frag0.setArguments(bun);
                ft.replace(R.id.lin2,frag0);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                ft.addToBackStack(null);
                ft.commit();
                Log.i("FragFor", uname);
    
                    break;
    
        //-------------------------------------------------------------------       
    
                case 1:
                          FromAcc acc=new FromAcc();
                          bun.putString("Name",uname); 
                          bun.putString("sessid",sessid);// key - value pair
                          bun.putString("custid",custid1);
                          acc.setArguments(bun);
                          ft.replace(R.id.lin2, acc);
                          ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                            ft.addToBackStack(null);
                            ft.commit();
    
    
                break;
                case 2:break;
                case 3:break;
                case 4:break;
                case 5:ChangepassFrag cf=new ChangepassFrag();
                      bun.putString("uname",uname);
                      bun.putString("sessid",sessid);
                      bun.putString("custid",custid);
                      bun.putString("password",pass);
                     cf.setArguments(bun);
                        ft.replace(R.id.lin2,cf);
                        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                        ft.addToBackStack(null);
                        ft.commit();
                        break;
    
                case 6:   break;
                case 7:break;
                case 8:break;
                case 9:
                       Fragment1 f=new Fragment1();
                       bun.putString("uname",uname);
                        bun.putString("sessid",sessid);
                    //  bun.putString("custid",custid1);
                        f.setArguments(bun);
                            ft.replace(R.id.lin2,f);
                            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                            ft.addToBackStack(null);
                            ft.commit();
                    break;
                case 10:break;
                }
    
    
    
    
                }
    
    
    
    
    
        });
    
    
    
    
    
        return v;
    }
    

    【讨论】:

    • 仓位顺序变了怎么办?
    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 2016-02-16
    • 2013-07-27
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多