2013-02-28 54 views
0

我想从我的JSON响应中向listview添加行。下面是我从中得到JSON和打印他们在cosole代码:修复列表视图上的JSONResponse

HttpClient hClient = new DefaultHttpClient(); 
     HttpGet hGet = new HttpGet(
       "APIHere"); 
     ResponseHandler<String> rHandler = new BasicResponseHandler(); 
     data = hClient.execute(hGet, rHandler); 

     JSONObject rootObj = new JSONObject(data); 
     JSONObject searchObj = rootObj.getJSONObject("searchdata"); 
     JSONArray titlesObj = searchObj.getJSONArray("titles"); 
     JSONArray descsObj = searchObj.getJSONArray("desc"); 
     JSONArray linksObj = searchObj.getJSONArray("links"); 

     for (int i = 0; i < titlesObj.length(); i++) { 
      String title = titlesObj.getString(i); 
      System.out.println("Titles: " + title); 
     } 

     for (int i = 0; i < descsObj.length(); i++) { 
      String desc = descsObj.getString(i); 
      System.out.println("Desc: " + desc); 
     } 

     for (int i = 0; i < linksObj.length(); i++) { 
      String link = linksObj.getString(i); 
      System.out.println("Link: " + link); 
     } 

我遍历整个JSONArray,我能打印那些在控制台中。现在,我想把这些响应放在listview中。我对此没有任何线索。

任何形式的帮助将不胜感激。

回答

0

有关读取的数组项,并显示到一个ListView:

ArrayList titles = new ArrayList(); 
ArrayList descs= new ArrayList(); 
ArrayList links= new ArrayList(); 

for (int i = 0; i < titlesObj.length(); i++) { 
     String title = titlesObj.getString(i); 
     titles.add(title); 
     System.out.println("Titles: " + title); 
    } 

    for (int i = 0; i < descsObj.length(); i++) { 
     String desc = descsObj.getString(i); 
     descs.add(title); 
     System.out.println("Desc: " + desc); 
    } 

    for (int i = 0; i < linksObj.length(); i++) { 
     String link = linksObj.getString(i); 
     links.add(title); 
     System.out.println("Link: " + link); 
    } 

接下来你做此ArrayList到ListView来源是这样的:

// Get a handle to the list views 

//get your instance of the listview for titles 

     ListView lvTitle = (ListView) findViewById(R.id.ListView01); 
    lv.setAdapter(new ArrayAdapter<string>((Your activity class).this, 
       android.R.layout.simple_list_item_1, titles)); 

//get your instance of the listview for descriptions 

ListView lvDesc = (ListView) findViewById(R.id.ListView02); 
    lv.setAdapter(new ArrayAdapter<string>((Your activity class).this, 
       android.R.layout.simple_list_item_1, descs)); 

//get your instance of the listview for links 

ListView lvLinks = (ListView) findViewById(R.id.ListView03); 
    lv.setAdapter(new ArrayAdapter<string>((Your activity class).this, 
       android.R.layout.simple_list_item_1, links)); 

编辑:

好吧,无论我说应该已经解决了你的问题。在真主里。但是,我可以看到你正在使用相同的活动来沟通一个rem ote服务器来获取数据。我建议,如果您为此单独创建一个类,最好返回json文本data。然后,您可以从您的活动中调用此类来获取数据并设置活动中的列表视图。这将避免不必要的滞后和强制关闭您的应用程序。

如果这解决了您的问题,请将其标记为帮助他人的答案。

UPDATE:

你需要实现一个自定义的适配器that.You需要定义一个listitem.xml使用布局按照您的requirement.Then它膨胀到列表视图。按照tutorial

样品行:

list_row.xml 

<!-- ListRow Left sied Thumbnail product image --> 
<LinearLayout android:id="@+id/thumbnail" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="3dip" 
    android:layout_alignParentLeft="true" 
    android:background="@drawable/image_bg" 
    android:layout_marginRight="5dip"> 

    <ImageView 
     android:id="@+id/list_image" 
     android:layout_width="50dip" 
     android:layout_height="50dip" 
     android:src="@drawable/someImage"/> 

</LinearLayout> 

<!-- Your title--> 
<TextView 
    android:id="@+id/title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@+id/thumbnail" 
    android:layout_toRightOf="@+id/thumbnail" 
    android:text="Big Title" 
    android:textColor="#040404" 
    android:typeface="sans" 
    android:textSize="15dip" 
    android:textStyle="bold"/> 

<!-- Your subtitle --> 
<TextView 
    android:id="@+id/subtitle" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/title" 
    android:textColor="#343434" 
    android:textSize="10dip" 
    android:layout_marginTop="1dip" 
    android:layout_toRightOf="@+id/thumbnail" 
    android:text="Smaller sub title" /> 

<!-- Rightend info --> 
<TextView 
    android:id="@+id/duration" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignTop="@id/title" 
    android:gravity="right" 
    android:text="info" 
    android:layout_marginRight="5dip" 
    android:textSize="10dip" 
    android:textColor="#10bcc9" 
    android:textStyle="bold"/> 

<!-- Rightend Arrow --> 
<ImageView android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/arrow" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true"/> 

这将使你的列表行的样子: enter image description here

注:我不鼓励音乐personally.This只是一个example.Please用它来做一个更好的目的:微笑:

+0

为什么要使用三种不同的listview?我想在一个listview中显示结果,其单行由标题,desc和URL组成。 – Anupam 2013-02-28 09:26:52

+0

好吧,你应该提到你需要达到什么目标。等几分钟inshallah – Nezam 2013-02-28 09:27:25

+0

Ameen ... !!!!!!!! – Anupam 2013-02-28 09:31:32

0

1.创建一个POJO根据自己的需要/响应你得到

public class SearchData { 
    private String title; 
    private String Description; 
    private String link; 

    //getter & setter methods for each field 
} 

2.创建一个对象List<SearchData>和通过解析响应

List<SearchData> list = new ArrayList<SearchData>(); 
//parse JSON array to SearchData object and add it to list 
list.add(searchDataObject); 

3a中填充它。如果您只愿意显示标题(即如果简单的布局就足够了)

ArrayAdapter<SearchData> adapter = new ArrayAdapter<Product>(this, android.R.layout.simple_list_item_1, list); 
listview.setAdapter(adapter); 

**您还需要重写SearchData POJO的toString()方法返回标题即

public class SearchData { 
    .... 
    @Override 
    public String toString() { 
     return title; 
    } 
} 

3B。在另一方面,如果你愿意使用自定义布局,那么你需要扩展一个ArrayAdapter并覆盖getView方法,然后绑定新的适配器,我们在步骤3a一样的工作方式,但这次与自定义适配器更换ArrayAdapter

资源:

的建议通过拉姆基兰1解析JSON响应的ListView:http://p-xr.com/android-tutorial-how-to-parse-read-json-data-into-a-android-listview/

2定制ListView和使用个人适配器:http://www.ezzylearning.com/tutorial.aspx?tid=1763429

1
HttpClient hClient = new DefaultHttpClient(); 
    HttpGet hGet = new HttpGet(
      "APIHere"); 
    ResponseHandler<String> rHandler = new BasicResponseHandler(); 
    data = hClient.execute(hGet, rHandler); 

    JSONObject rootObj = new JSONObject(data); 
    JSONObject searchObj = rootObj.getJSONObject("searchdata"); 
    JSONArray titlesObj = searchObj.getJSONArray("titles"); 
    JSONArray descsObj = searchObj.getJSONArray("desc"); 
    JSONArray linksObj = searchObj.getJSONArray("links"); 

    String[] a = new String[titlesObj.length()]; 

    String[] b = new String[descsObj.length()]; 

    String[] c = new String[linksObj.length()]; 

    for (int i = 0; i < titlesObj.length(); i++) { 

    String title = titlesObj.getString(i); 

    a[i] = title; 

    } 

    for (int i = 0; i < descsObj.length(); i++) { 

    String desc = descsObj.getString(i); 

    b[i] = desc; 

    } 

    for (int i = 0; i < linksObj.length(); i++) { 

    String link = linksObj.getString(i); 

    c[i] = link; 

    } 

    ArrayList<String> al=new ArrayList<String>(); 


    //if three jsonarrays having same length 

    for(i=0;i<linksObj.length();i++) 

    { 

    al.add(" " +a[i]+" " +b[i]+""+c[i]+""); 

    } 

    ArrayAdapter<String> adapter=new ArrayAdapter<String>this,android.R.layout.simple_list_item_1,al); 

    ListView lv=(ListView)findViewById(R.id.listview); 

lv.setAdapter(adapter); 
    }