【问题标题】:Open a new view on clicking ListView item单击 ListView 项打开一个新视图
【发布时间】:2014-08-14 09:28:37
【问题描述】:

我有一个列表视图,它显示来自 JSON 的数据。我想点击一个特定的列表视图项目,当点击该项目时,它应该显示被点击的列表视图项目的整个视图。

例如:列表视图中的新闻列表 ---> 单击任何新闻项目 ----> 该新闻的详细版本

我创建的那个不能正常工作。当我在列表视图中单击一个新闻项目时,它会显示所有新闻的详细版本。我该如何解决这个问题。

这是我的 NewsFragment 类。它有列表视图

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();

                /*   FragmentTransaction fragmentTransaction = getFragmentManager()
                            .beginTransaction();
            Fragment profileFragment = new NewsDetailFragment();//the fragment you want to show
            Bundle bundle = null;
            profileFragment.setArguments(bundle);
            fragmentTransaction
                .add(R.id.content_frame, profileFragment);//R.id.content_frame is the layout you want to replace
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.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 这是整个新闻视图的片段。

package com.fortuna.cinemalk;

import java.util.ArrayList;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
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 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);



        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();
        }

    }


}

【问题讨论】:

  • 我认为您需要在 AsyncTask 中传递一个字符串,以便它只给出特定的消息。例如,用户单击 ListView 中的政治,您的方法如 newsdetail = JSONServices.getNewsDescription("politics");。试试那个轨道。
  • 我在 JSON 中有这么多新闻项目。所以我不认为为每个新闻项目传递一个字符串就是答案。
  • 如果你需要显示每个列表项的细节,你必须有一些数据结构。项目及其描述之间的映射。
  • 你能举个例子吗?

标签: android json listview android-listview


【解决方案1】:

你应该像我在这里展示的那样传递 news'id:

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

           {


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


 public class NewsDetailFragment extends Fragment {

  public static NewsDetailFragment newInstance (int id){

   NewsDetailFragment  frag=new NewsDetailFragment ();
   Bundle bundle=new Bundle();
   bundle.putInt("id",id);
   frag.setArguments(bundle);
   return frag;
 }


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

   ........

   new BackGround().execute(getArguments.getInt("id"));

 }

  .......

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

    @Override
    protected String doInBackground(Integer... params) {
       int id=params[0];
        newsdetail = JSONServices.getNewsDescription(id);
        return newsdetail;
    } 

   protected void onPostExecute(String newsdetail) {

        commonVariable.setTheater(newsdetail);
        adapter = new LazyAdapter(newsdetail, activity,Element.NEWS_DETAIL.getType());
        ((AdapterView<ListAdapter>) view1).setAdapter(adapter);
        super.onPostExecute(result);
    }

【讨论】:

  • 我应该保持我的 onPostExecute 原样吗?
猜你喜欢
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 2013-02-10
  • 2018-03-02
相关资源
最近更新 更多