java - Android 项目中带有 2 个字符串的 ListView/ListAdapter

标签 java android listview

我正在开发 Android 项目。我按照 http://www.vogella.com/articles/AndroidSQLite/article.html 的教程进行操作但我坚持做某事。教程展示了如何将 Class 与 1 个 String 对象一起使用。我正在使用 2 个 String 对象。所以我改变了一些东西(向我的类添加新的 String,将layout.simple_list_item_1 更改为 android.R.layout.simple_list_item_2 等)现在的问题是 - 如何制作一些东西来获取 Stoliki 类对象(覆盖 toString() 给了我只有 1 项,所以没用)。

斯托利基类

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

    } 

Activity

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

} 

最佳答案

http://www.youtube.com/watch?v=wDBM6wVEO70 。 Romain Guy(Google 的 Android 开发人员)的 Listview 演讲。

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>   

自定义行。行.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;

 }
 }

编辑:

您的 Activity 将有一个 ListView 。这是在 oncreate setContentView(R.layout.activity_main); 中设置的。主布局将有一个 ListView 。您将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. 

您必须使用 View 保持器才能实现平滑滚动和性能。假设 1000 行是带有图像的 lstview,它可能会导致内存异常。摆脱这个问题的一种方法是回收 View 。可见 View (行)不会被回收。顶部链接中的视频对该主题有详细说明

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(每个 ListView 行的布局都膨胀)

 <?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>

主要 Activity

   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

关于java - Android 项目中带有 2 个字符串的 ListView/ListAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15921446/

相关文章:

java - JVM 中的多线程——它们什么时候使用多核?

android - 在 com.android.build.gradle.internal.api.ApplicationVariantImpl 上找不到属性 'outputFile'

android - OnFocusChangeListener 监听背景点击

android - 在textview中显示listview的选定值

android ListView onItemClick

安卓 ListView : Removing Sub item dependent upon the item

java - JSP 中的类无法看到彼此

java - GWT 客户端中哪个是好的 Java 或 Json?

Java 8 map : filter value and throw exception if match found

android - ShareDialog 无法打开 Facebook 应用程序