2012-11-30 44 views
-2

我有以下代碼:如何創建自定義適配器列表視圖

package com.example.myfirstapp; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.UnknownHostException; 
import java.util.ArrayList; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.util.EntityUtils; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.TextView; 

public class FetchData extends Activity { 
    private TextView textView; 
    private JSONObject jObject; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_fetch_data); 
     textView = (TextView) findViewById(R.id.TextView1); 

     Intent intent = getIntent(); 
     String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 
     readWebpage(message); 
    } 

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... urls) { 
      String response = ""; 
      for (String url : urls) { 
       DefaultHttpClient client = new DefaultHttpClient(); 
       HttpGet httpGet = new HttpGet(url); 
       try { 
        HttpResponse execute = client.execute(httpGet); 
        InputStream content = execute.getEntity().getContent(); 

        BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 
        String s = ""; 
        while ((s = buffer.readLine()) != null) { 
         response += s; 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return response; 
      mParseResponse(response); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      textView.setText(result); 
     } 
    } 

    public void readWebpage(String message) { 

     //Intent intent = getIntent(); 
     //String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 

     DownloadWebPageTask task = new DownloadWebPageTask(); 
     task.execute(new String[] {message}); 

    } 

    ArrayList<String> year, title, details, director, rating, cover; 
    // For Parse Login Response From Server 
    public void mParseResponse(String response) throws UnknownHostException { 

     year=new ArrayList<String>(); 
     title=new ArrayList<String>(); 
     details=new ArrayList<String>(); 
     director=new ArrayList<String>(); 
     rating=new ArrayList<String>(); 
     cover=new ArrayList<String>(); 

     try { 
      JSONObject jObject = new JSONObject(response); 
      JSONObject jsonobjresults = jObject.getJSONObject("results"); 
      JSONArray jsonarrayresult = jsonobjresults.getJSONArray("result"); 
      for(int i=0;i<jsonarrayresult.length(); i++){ 
       JSONObject mJsonObj = jsonarrayresult.getJSONObject(i); 
       year.add(mJsonObj.getString("year")); 
       title.add(mJsonObj.getString("title")); 
       details.add(mJsonObj.getString("details")); 
       director.add(mJsonObj.getString("director")); 
       rating.add(mJsonObj.getString("rating")); 
       cover.add(mJsonObj.getString("cover")); 
      } 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

我越來越困惑,如何創建一個自定義的適配器。是的,我已經參加了教程,但混亂仍然存在。另外,我在撥打mParseResponse時遇到錯誤。任何想法,我錯了,我應該如何實現列表視圖?

+0

我認爲你在尋找自定義列表視圖? – Akhil

+0

是的,列表視圖必須包含一個圖像。從我遵循的教程中,他們只是手動添加圖像。在我的情況下,我的MainActivity請求用戶輸入,將其發送到我的服務器,服務器返回JSON字符串。我需要解析這個json並將結果放在列表視圖中。該列表視圖必須在每一行的左側有相應的圖像。我真的沒有得到如何做到這一點。 – PSN

+0

你有沒有使用基類適配器擴展的類? – Akhil

回答

0

也許這個簡單的示例自定義適配器列表視圖將得到你的腳與這個東西。 主要活動

public class MainActivity extends Activity { 

    String [] children = { 
      "Award 1", 
      "Award 2", 
      "Award 3", 
      "Award 4", 
      "Award 5", 
      "Award 6", 
      "Award 7", 
      "Award 8", 
      "Award 9", 
      "Award 10", 
      "Award 11", 
      "Award 12", 
      "Award 13", 
      "Award 14", 
      "Award 15"}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ListView list = (ListView) findViewById(R.id.listview); 
     CustomAdapter adapter = new CustomAdapter(this, children); 
     list.setAdapter(adapter); 
    } 

定製適配器

public class CustomAdapter extends BaseAdapter { 
// you could have instead extend ArrayAdapter if you wished, i find it less fickle but less flexible 
// extends CursorAdapter is available too for listviews backed by cursors 
    private LayoutInflater inflator; 
    private String[] children; 

    public CustomAdapter(Context context, String[] children) { 
     super(); 
//  pass what you need into the constructor. in this case the string array and context. 
//  do as much as you can here and not in getView because getView acts for each row 
//  --> it will greatly help performance 
     this.children = children; 
     inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
//  v---- your listview won't show anything if this is left default (at 0). 
     return children.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
//  getView is where all the action takes place 
//  first inflate the xml that holds the row and somehow connect it to convertView, the parameter 
//  checking if null allows these views to be recycled when they go off-screen not just made one per row 
//  ---> it will greatly help performance 
     if (convertView == null) { 
      convertView = inflator.inflate(R.layout.row, parent, false); 
     } 
//  then find the individual views with this xml (everything just like onCreate) 
     ImageView img = (ImageView) convertView.findViewById(R.id.imageView1); 
     TextView tv = (TextView) convertView.findViewById(R.id.textView1); 
//  then perform your actions to the your views 
//  each textView is set to an element in the array based on position. this is my listview limiter here. 
//  each imageview is set to the same picture but you should now have an idea how to set different images (based on position) 
//  using listview position in correspondence with array/arraylist positions is a very useful technique. 
     img.setImageResource(R.drawable.ic_launcher); 
     tv.setText(children[position]); 
//  v---- return your view, it's important. 
     return convertView; 
    } 

} 

row.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:text="TextView" /> 

</RelativeLayout> 

結果 sshot

要獲得的ListView超級熟悉看看這個視頻: http://www.youtube.com/watch?v=wDBM6wVEO70

至於你的其他問題,你將不得不發佈logcat更好的迴應。

相關問題