2013-04-10 59 views
0

我正在开发Android项目。我遵循http://www.vogella.com/articles/AndroidSQLite/article.html的教程,但我坚持的东西。教程展示了如何使用带有1个String对象的Class。我正在处理2个String对象。所以我改变了一些东西(将新的String添加到我的类中,将layout.simple_list_item_1改为android.R.layout.simple_list_item_2等)。现在问题是 - 如何使某些东西获得Stoliki类对象(重写toString()只有1件,所以没用)。在Android项目中使用2个字符串的ListView/ListAdapter

类Stoliki

public class Stoliki { 
     private long id; 
     private String numer; 
     private String opis; 

     public long getId() { 
     return id; 
     } 

     public void setId(long id) { 
     this.id = id; 
     } 

     public String getNumer() { 
     return numer; 
     } 

     public void setNumer(String numer) { 
     this.numer = numer; 
     } 

     public String getOpis() { 
      return opis; 
     } 

     public void setOpis(String opis) { 
      this.opis = opis; 
     } 

    } 

活性
import android.app.ListActivity; 
import android.os.Bundle; 
import java.util.List; 
import java.util.Random; 
import android.view.View; 
import android.widget.ArrayAdapter; 

public class FirstGridPage extends ListActivity { 
     private StolikiDataSource datasource; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_view_list_stoliki); 

    datasource = new StolikiDataSource(this); 
    datasource.open(); 

    List<Stoliki> values = datasource.getAllStoliki(); 

    // Use the SimpleCursorAdapter to show the 
    // elements in a ListView 
    ArrayAdapter<Stoliki> adapter = new ArrayAdapter<Stoliki>(this, 
     android.R.layout.simple_list_item_1, values); 
    setListAdapter(adapter); 
    } 

    // Will be called via the onClick attribute 
    // of the buttons in main.xml 
    public void onClick(View view) { 
    @SuppressWarnings("unchecked") 
    ArrayAdapter<Stoliki> adapter = (ArrayAdapter<Stoliki>) getListAdapter(); 
    Stoliki stolik = null; 
    switch (view.getId()) { 
    case R.id.add: 
     String[] stoliki_numer = new String[] { "1", "2", "3" }; 
     String[] stoliki_opis = new String[] { "Czerwony", "Niebieski", "Zielony" }; 
     int nextInt = new Random().nextInt(3); 
     // Save the new comment to the database 
     stolik = datasource.createStolik(stoliki_numer[nextInt], stoliki_opis[nextInt]); 
     adapter.add(stolik); 
     break; 
    case R.id.delete: 
     if (getListAdapter().getCount() > 0) { 
      stolik = (Stoliki) getListAdapter().getItem(0); 
     datasource.deleteStolik(stolik); 
     adapter.remove(stolik); 
     } 
     break; 
    } 
    adapter.notifyDataSetChanged(); 
    } 

    @Override 
    protected void onResume() { 
    datasource.open(); 
    super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
    datasource.close(); 
    super.onPause(); 
    } 

} 
+1

使用自定义列表适配器 – Raghunandan 2013-04-10 09:04:19

+0

只是一个提示:总是使用英语变量名称。这真是丑陋的“setOpis”,即使它只是训练应用程序,使用英文名称来训练和习惯它。 – Mateusz 2013-04-10 09:31:05

+0

是的。这是丑陋的,但只为我们(波兰人)。无论如何,我仍然在学习Java,阅读代码更加清晰。 – boski 2013-04-10 10:57:53

回答

1

http://www.youtube.com/watch?v=wDBM6wVEO70。 ListView由Romain guy(谷歌Android开发人员)发言。

main.xml中

<ListView android:id="@+id/list" 
android:layout_width="fill_parent" 
android:layout_height="0dip" 
android:focusableInTouchMode="false" 
android:listSelector="@android:color/transparent" 
android:layout_weight="2" 
android:headerDividersEnabled="false" 
android:footerDividersEnabled="false" 
android:dividerHeight="8dp" 
android:divider="#000000" 
android:cacheColorHint="#000000" 
android:drawSelectorOnTop="false"> 
</ListView> 
</LinearLayout> 

Customw行。 row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:background="#ffffff" 
    > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" 
    android:background="@drawable/itembkg" 
    /> 

<TextView 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="20dp" 
    android:text="TextView" /> 

</LinearLayout> 

public class CustomListView extends Activity { 
/** Called when the activity is first created. */ 

ListView lv1; 
Customlistadapter cus; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    // Button b= (Button) findViewById(R.id.remove); 
    lv1 = (ListView) findViewById(R.id.list); 
    cus= new Customlistadapter(this); 
    lv1.setAdapter(cus); 

}   
    } 

自定义列表适配器。为每行填充自定义布局。

public class Customlistadapter extends ArrayAdapter { 

private LayoutInflater mInflater; 
    Context c; 

public Customlistadapter(CustomListView customListView) { 
    super(customListView, 0); 
    // TODO Auto-generated constructor stub 
    this.mInflater = LayoutInflater.from(customListView); 
    c=customListView; 
} 
public int getCount() { 
    return 20; // number of listview rows. 
} 

public Object getItem(int arg0) { 
    return arg0; 
} 

public long getItemId(int arg0) { 
return arg0; 
} 

public View getView(final int arg0, View arg1, ViewGroup arg2) { 
    final ViewHolder vh; 
    vh= new ViewHolder(); 

    if(arg1==null) 
    { 
     arg1=mInflater.inflate(R.layout.row, arg2,false); 
     vh.tv1= (TextView)arg1.findViewById(R.id.textView1); 
     vh.tv2= (TextView)arg1.findViewById(R.id.textView2); 
    } 
    else 
    { 
    arg1.setTag(vh); 
    } 
     vh.tv1.setText("hello");  
     vh.tv2.setText("hello"); 

    return arg1; 
} 

    static class ViewHolder //use a viewholder for smooth scrolling and performance. 
    { 
TextView tv1,tv2; 

} 
} 

编辑:

您的活动将有一个列表视图。这在oncreate setContentView(R.layout.activity_main);中设置。主布局将有一个列表视图。您将listview的适配器设置为listview.setAdapter(youradapter);

然后,listview将有自定义布局,即为每个行项目充气的row.xml。您为listview定制的适配器是row.xml充满的地方。您定义了扩展ArrayAdapter的类CustomAdapter。你重写一组方法。

getCount() --- size of listview. 
    getItem(int position) -- returns the position 
    getView(int position, View convertView, ViewGroup parent) 
    // position is the position in the listview. 
    //convertview - view that is tobe inflated 
    // you will return the view that is infated. 

你将不得不使用一个视图的平滑滚动和性能。想象一下,1000行是与图像一起查看可能会导致内存异常。摆脱这种情况的一种方法是回收视图。可见视图(行)不会被回收。在顶部的链接的视频对主题

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:background="#0095FF"> 

<ListView android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:focusableInTouchMode="false" 
    android:listSelector="@android:color/transparent" 
    android:layout_weight="2" 
    android:headerDividersEnabled="false" 
    android:footerDividersEnabled="false" 
    android:dividerHeight="8dp" 
    android:divider="#000000" 
    android:cacheColorHint="#000000" 
    android:drawSelectorOnTop="false"> 
    </ListView> 
</LinearLayout> 

row.xml(布局充气每个列表视图行)详细说明

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:text="Header" /> 

<TextView 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="80dp" 
    android:layout_gravity="center" 
    android:text="TextView" /> 

</LinearLayout> 

MainActivity

public class MainActivity extends Activity { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ListView ll = (ListView) findViewById(R.id.list); 
    CustomAdapter cus = new CustomAdapter(); 
    ll.setAdapter(cus); 

} 

class CustomAdapter extends BaseAdapter 
{ 
    LayoutInflater mInflater; 


    public CustomAdapter() 
    { 
     mInflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return 30; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     final ViewHolder vh; 
     vh= new ViewHolder(); 

     if(convertView==null) 
     { 
      convertView=mInflater.inflate(R.layout.row, parent,false); 

      vh.tv2= (TextView)convertView.findViewById(R.id.textView2); 
      vh.tv1= (TextView)convertView.findViewById(R.id.textView2); 


     } 
     else 
     { 
     convertView.setTag(vh); 
     } 
      vh.tv1.setText("my text"); 
      vh.tv2.setText("Postion = "+position); 
     return convertView; 
    } 

class ViewHolder 
{ 
    TextView tv1,tv2; 
} 
} 
} 

enter image description here

+1

不工作。这对我来说也太难了。 – boski 2013-04-10 10:55:58

+0

@boski它的工作原理。困难的方式,我不明白。你想让我发布相同的快照? – Raghunandan 2013-04-10 11:38:11

+0

@boski检查编辑可能会帮助你。它有效,但你必须做对。因为您可以在一行中看到快照两个文字浏览。 – Raghunandan 2013-04-10 12:02:09

相关问题