Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
185 views
in Technique[技术] by (71.8m points)

android - How to create a listview with custom adapter

I have the following code:

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

I am getting confused as to how to create a custom adapter. Yes, i have gone thoeugh tutorials but confusion still exits. Plus, I am having an error when i make a call to mParseResponse. Any ideas where I am going wrong and how should i implement list view?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Perhaps this simple sample custom adapter listview will get on your feet with this stuff. The main activity

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

The custom 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>

The result sshot

To get super acquainted with listview check out this video: http://www.youtube.com/watch?v=wDBM6wVEO70

As for your other issue, you're gonna have to post a logcat for better responses.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...