2012-09-02 37 views
8

tengo una aplicación que muestra datos en listview, pero quiero que la primera fila esté inflada por un diseño diferente, y lo hice pero como no debe haber una gran cantidad de listitems, quiero optimizar listview y hay problema. no puedo optimizar listview cuando listview llenado iam de esa manera, así que ¿cómo puedo poner contenido que debe ir en la fila puño en el interior de la bruja de cabecera vista de lista se infla por algún diseño, aquí está el código del adaptadorAndroid listview header

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.main); 

    LinearLayout content = (LinearLayout) findViewById(R.id.content); 
    LinearLayout refLayout = (LinearLayout) findViewById(R.id.refLayout); 

    refLayout.setVisibility(View.GONE); 

    mBtnNaslovnica = (Button) findViewById(R.id.mBtnNaslovnica); 
    mBtnNaslovnica.setSelected(true); 
    TextView txtView=(TextView) findViewById(R.id.scroller); 
txtView.setSelected(true); 
    loadPage(); 
    ImageButton mBtnRefresh = (ImageButton) findViewById(R.id.btnRefresh); 
    mBtnRefresh.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      new LoadingTask().execute(URL); 
     } 
    }); 

} 

public void loadPage(){ 

    ArrayList<HashMap<String, String>> homeList = new ArrayList<HashMap<String, String>>(); 



     JSONObject jsonobj; 
     try { 
      jsonobj = new JSONObject(getIntent().getStringExtra("json")); 
      JSONObject datajson = jsonobj.getJSONObject("data"); 
      JSONArray news = datajson.getJSONArray(TAG_NEWS); 
      JSONArray actual = datajson.getJSONArray("actual"); 
      for(int i = 0; i < news.length(); i++){ 
       JSONObject c = news.getJSONObject(i); 

       // Storing each json item in variable 
       String id = c.getString(TAG_ID); 
       String title = c.getString(TAG_TITLE); 
       String story = c.getString(TAG_STORY); 
       String shorten = c.getString(TAG_SH_STORY); 
       String author = c.getString(TAG_AUTHOR); 
       String datetime = c.getString(TAG_DATETIME); 
       String img = c.getString(TAG_IMG); 
       String big_img = c.getString(TAG_BIG_IMG); 



       // creating new HashMap 
       HashMap<String, String> map = new HashMap<String, String>(); 

       // adding each child node to HashMap key => value 
       map.put(TAG_ID, id); 
       map.put(TAG_TITLE, title); 
       map.put(TAG_STORY, story); 
       map.put(TAG_IMG, img); 
       map.put(TAG_BIG_IMG, big_img); 
       map.put(TAG_DATETIME, datetime); 
       map.put(TAG_AUTHOR, author); 

       // adding HashList to ArrayList 
       homeList.add(map);} 
      for(int i = 0; i < actual.length(); i++){ 
       JSONObject c = actual.getJSONObject(i); 

       // Storing each json item in variable 
       String id = c.getString(TAG_ACT_TIME); 
       String body = c.getString(TAG_ACT_BODY); 
       String anews = " | "+ id+ " " + body; 
       String cur_anews = ((TextView) findViewById(R.id.scroller)).getText().toString(); 
       String complete = anews + cur_anews; 
       TextView anewstv = (TextView) findViewById(R.id.scroller); 
       anewstv.setText(complete); 

       } 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 






    list=(ListView)findViewById(R.id.list); 

    // Getting adapter by passing xml data ArrayList 
    adapter=new LazyAdapter(this, homeList);   
    list.setAdapter(adapter); 


    // Click event for single list row 
    list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
      String cur_title = ((TextView) view.findViewById(R.id.title)).getText().toString(); 
      String cur_story = ((TextView) view.findViewById(R.id.einfo2)).getText().toString(); 
      String cur_author = ((TextView) view.findViewById(R.id.einfo1)).getText().toString(); 
      String cur_datetime = ((TextView) view.findViewById(R.id.tVdatetime)).getText().toString(); 
      String cur_actual = ((TextView) findViewById(R.id.scroller)).getText().toString(); 
      ImageView cur_img = (ImageView) view.findViewById(R.id.list_image); 
      String cur_img_url = (String) cur_img.getTag(); 

      Intent i = new Intent("com.example.androidhive.CURENTNEWS"); 
      i.putExtra("CUR_TITLE", cur_title); 
      i.putExtra("CUR_STORY", cur_story); 
      i.putExtra("CUR_AUTHOR", cur_author); 
      i.putExtra("CUR_DATETIME", cur_datetime); 
      i.putExtra("CUR_IMG_URL", cur_img_url); 
      i.putExtra("CUR_ACTUAL", cur_actual); 
      startActivity(i); 
     } 
    });  
} 

public void reloadPage(String jsonstring){ 
    ArrayList<HashMap<String, String>> homeList = new ArrayList<HashMap<String, String>>(); 



    JSONObject jsonobj; 
    try { 
     jsonobj = new JSONObject(jsonstring); 
     JSONObject datajson = jsonobj.getJSONObject("data"); 
     JSONArray news = datajson.getJSONArray(TAG_NEWS); 
     JSONArray actual = datajson.getJSONArray("actual"); 
     for(int i = 0; i < news.length(); i++){ 
      JSONObject c = news.getJSONObject(i); 

      // Storing each json item in variable 
      String id = c.getString(TAG_ID); 
      String title = c.getString(TAG_TITLE); 
      String story = c.getString(TAG_STORY); 
      String shorten = c.getString(TAG_SH_STORY); 
      String author = c.getString(TAG_AUTHOR); 
      String datetime = c.getString(TAG_DATETIME); 
      String img = c.getString(TAG_IMG); 
      String big_img = c.getString(TAG_BIG_IMG); 


      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 

      // adding each child node to HashMap key => value 
      map.put(TAG_ID, id); 
      map.put(TAG_TITLE, title); 
      map.put(TAG_STORY, story); 
      map.put(TAG_IMG, img); 
      map.put(TAG_BIG_IMG, big_img); 
      map.put(TAG_DATETIME, datetime); 
      map.put(TAG_AUTHOR, author); 

      // adding HashList to ArrayList 
      homeList.add(map);} 
     for(int i = 0; i < actual.length(); i++){ 
      JSONObject c = actual.getJSONObject(i); 

      // Storing each json item in variable 
      String id = c.getString(TAG_ACT_TIME); 
      String body = c.getString(TAG_ACT_BODY); 
      String anews = " | "+ id+ " " + body; 
      String cur_anews = ((TextView) findViewById(R.id.scroller)).getText().toString(); 
      String complete = anews + cur_anews; 
      TextView anewstv = (TextView) findViewById(R.id.scroller); 
      anewstv.setText(complete); 

      } 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 






list=(ListView)findViewById(R.id.list); 

// Getting adapter by passing xml data ArrayList 
adapter=new LazyAdapter(this, homeList);   
list.setAdapter(adapter); 


// Click event for single list row 
list.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
     String cur_title = ((TextView) view.findViewById(R.id.title)).getText().toString(); 
     String cur_story = ((TextView) view.findViewById(R.id.einfo2)).getText().toString(); 
     String cur_author = ((TextView) view.findViewById(R.id.einfo1)).getText().toString(); 
     String cur_datetime = ((TextView) view.findViewById(R.id.tVdatetime)).getText().toString(); 
     String cur_actual = ((TextView) findViewById(R.id.scroller)).getText().toString(); 
     ImageView cur_img = (ImageView) view.findViewById(R.id.list_image); 
     String cur_img_url = (String) cur_img.getTag(); 

     Intent i = new Intent("com.example.androidhive.CURENTNEWS"); 
     i.putExtra("CUR_TITLE", cur_title); 
     i.putExtra("CUR_STORY", cur_story); 
     i.putExtra("CUR_AUTHOR", cur_author); 
     i.putExtra("CUR_DATETIME", cur_datetime); 
     i.putExtra("CUR_IMG_URL", cur_img_url); 
     i.putExtra("CUR_ACTUAL", cur_actual); 
     startActivity(i); 
    } 
}); 
} 

public void startNewActivity(){ 

} 
public class LoadingTask extends AsyncTask<String, Object, Object>{ 
    XMLParser parser = new XMLParser(); 
    JSONParser jParser = new JSONParser(); 
    LinearLayout content = (LinearLayout) findViewById(R.id.content); 
    LinearLayout refLayout = (LinearLayout) findViewById(R.id.refLayout); 

    protected void onPreExecute(){ 
     content.setClickable(false); 
     refLayout.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected Object doInBackground(String... params) { 
     // TODO Auto-generated method stub 


     String URL = params[0]; 
     JSONObject json = jParser.getJSONFromUrl(URL); 
     //String xml = parser.getXmlFromUrl(URL); // getting XML from URL 
     // getting DOM element 
     return json; 
    } 

    protected void onPostExecute(Object result){ 
     String json; 
     json = result.toString(); 
     reloadPage(json); 
     refLayout.setVisibility(View.GONE); 
    } 


} 



} 

Respuesta

18

Si consiguiera su punto - puede ir con 2 enfoques:

  1. Añadir headerView a la lista. Eso es tan fácil como inflar su Vista y pasarla al addHeaderView(View) de su Lista. Nota: debe agregar esta vista antes de configurar el adaptador, o arrojará la excepción.

  2. Sin embargo, como su "encabezado" representa los mismos datos que todos los demás elementos, pero tiene un diseño diferente - sugiero no usar el encabezado aquí. En su lugar, intente implementar getItemViewType() en su adaptador. http://developer.android.com/reference/android/widget/BaseAdapter.html#getItemViewType(int) Si lo hace, podrá verificar qué tipo de diseño volver en el método getView(). Y Android se encargará de optimizar y reutilizar sus Vistas infladas, para que pueda estar seguro de que el convertView, pasado a su getView, será del tipo y diseño correctos.

Háganme saber si debería explicarlo con más detalles.

+0

se ha explicado suficientemente THX :) –

0

Puede hacerlo de esta manera:

... 
convertView.setOnClickListener(new OnItemClick(position)); 
... 
public class OnItemClick implements OnClickListener { 
    private final int index; 
    public OnItemClick(int _index) { 
      this.index = _index; 
     } 
    @Override 
    public void onClick(View v) { 
     //dosomething 
    } 
}