Android:使用timline创建ListView

Android:使用timline创建ListView,android,listview,Android,Listview,我的应用程序中有一个ListView,其中包含在不同时间发生的事件 在我的ListView中,我想显示它们按时间排序,时间在左侧 | 12:00 | Event1 | 13:00 | | 14:00 | Event2 | 15:00 | Event2 | 16:00 | Event3 诸如此类,有人能就从何处开始提供建议吗?您必须创建自己的适配器来扩展BaseAdapter,并在其上创建一个特定的布局文件,用于每一行 假设您有一个Map mMap=newhashmap,其

我的应用程序中有一个ListView,其中包含在不同时间发生的事件

在我的ListView中,我想显示它们按时间排序,时间在左侧

| 12:00 |   Event1
| 13:00 |   
| 14:00 |   Event2
| 15:00 |   Event2
| 16:00 |   Event3

诸如此类,有人能就从何处开始提供建议吗?

您必须创建自己的适配器来扩展BaseAdapter,并在其上创建一个特定的布局文件,用于每一行

假设您有一个
Map mMap=newhashmap
,其中有事件,另一个位置有事件的时间

然后创建新的适配器,比如说MyAdapter

MyAdapter mAdapter = new MyAdapter(mMap);
通过调用
.setAdapter()
方法,可以将适配器添加到ListView中

例如,
myListView.setAdapter(MyAdapter)

在自定义适配器中,您必须实现一些方法。其中之一是
getView()

在那里,您必须通过传递给适配器的
HashMap
来解析数据。 在您的row_layout.xml中,您必须使用相对布局并添加适当的文本字段来显示所需的信息

希望对你有帮助


也请检查此链接:

通常,列表适配器使用某种数据结构或容器来存储其对象。如果需要添加新元素,请先将其添加到容器中,对其元素进行排序,然后调用

adapter.notifyDataSetChanged();
让它知道其数据已更改,需要更新

这里只是一个小例子,可以引导您走向正确的方向。我希望你会觉得它有用

定义您的ListActivity:

package com.myapp.listviewexample;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ListViewExampleActivity extends ListActivity {

    static final String[] COUNTRIES = new String[] {
        "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
        "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina",
        "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan"
      };


    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      //setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, COUNTRIES));
      final MyListAdapter adapter = new MyListAdapter(this, COUNTRIES);
      setListAdapter(adapter);

      ListView lv = getListView();
      //lv.setTextFilterEnabled(true);

      lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {

            adapter.removeItem(position);
            adapter.notifyDataSetChanged();
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText() + " removed",
              Toast.LENGTH_SHORT).show();
        }
      });
    }

}
package com.myapp.listviewexample;

import java.util.ArrayList;
import java.util.Arrays;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyListAdapter extends BaseAdapter {

    private ArrayList<String> items;
    private Context mContext;

    public MyListAdapter(Context c, String[] countries) {
        items = new ArrayList<String>(Arrays.asList(countries));
        mContext = c;
        Log.i("MyListAdapter", "countries.length == items.size() " + (countries.length == items.size()));
    }

    public int getCount() {
        return items.size();
    }

    public Object getItem(int position) {
        return items.get(position);
    }

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

    public void removeItem(int position) {
        items.remove(position);
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = li.inflate(R.layout.list_item, null);
        } else {
            view = convertView;
        }

        TextView tv = (TextView) view;//.findViewById(R.id.text_view_item);
        tv.setText(items.get(position));

        return view;
    }

}
package com.myapp.listviewexample;
导入android.app.ListActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.ListView;
导入android.widget.TextView;
导入android.widget.Toast;
公共类ListViewExampleActivity扩展了ListActivity{
静态最终字符串[]国家/地区=新字符串[]{
“阿富汗”、“阿尔巴尼亚”、“阿尔及利亚”、“美属萨摩亚”、“安道尔”,
“安哥拉”、“安圭拉”、“南极洲”、“安提瓜和巴布达”、“阿根廷”,
“亚美尼亚”、“阿鲁巴”、“澳大利亚”、“奥地利”、“阿塞拜疆”
};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//setListAdapter(新阵列适配器(此,R.layout.list_项,国家/地区));
最终MyListAdapter适配器=新的MyListAdapter(此,国家/地区);
setListAdapter(适配器);
ListView lv=getListView();
//lv.setTextFilterEnabled(真);
lv.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
适配器。拆卸项目(位置);
adapter.notifyDataSetChanged();
//单击后,显示带有文本视图文本的祝酒词
Toast.makeText(getApplicationContext(),((TextView)视图).getText()+“已删除”,
吐司。长度(短)。show();
}
});
}
}
定义列表适配器:

package com.myapp.listviewexample;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ListViewExampleActivity extends ListActivity {

    static final String[] COUNTRIES = new String[] {
        "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
        "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina",
        "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan"
      };


    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      //setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, COUNTRIES));
      final MyListAdapter adapter = new MyListAdapter(this, COUNTRIES);
      setListAdapter(adapter);

      ListView lv = getListView();
      //lv.setTextFilterEnabled(true);

      lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {

            adapter.removeItem(position);
            adapter.notifyDataSetChanged();
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText() + " removed",
              Toast.LENGTH_SHORT).show();
        }
      });
    }

}
package com.myapp.listviewexample;

import java.util.ArrayList;
import java.util.Arrays;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyListAdapter extends BaseAdapter {

    private ArrayList<String> items;
    private Context mContext;

    public MyListAdapter(Context c, String[] countries) {
        items = new ArrayList<String>(Arrays.asList(countries));
        mContext = c;
        Log.i("MyListAdapter", "countries.length == items.size() " + (countries.length == items.size()));
    }

    public int getCount() {
        return items.size();
    }

    public Object getItem(int position) {
        return items.get(position);
    }

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

    public void removeItem(int position) {
        items.remove(position);
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = li.inflate(R.layout.list_item, null);
        } else {
            view = convertView;
        }

        TextView tv = (TextView) view;//.findViewById(R.id.text_view_item);
        tv.setText(items.get(position));

        return view;
    }

}
package com.myapp.listviewexample;
导入java.util.ArrayList;
导入java.util.array;
导入android.content.Context;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.TextView;
公共类MyListAdapter扩展了BaseAdapter{
私有ArrayList项;
私有上下文;
公共MyListAdapter(上下文c,字符串[]国家/地区){
items=新的ArrayList(Arrays.asList(countries));
mContext=c;
Log.i(“MyListAdapter”、“countries.length==items.size()”+(countries.length==items.size());
}
public int getCount(){
返回items.size();
}
公共对象getItem(int位置){
返回项目。获取(位置);
}
公共长getItemId(int位置){
返回位置;
}
公共无效删除项(内部位置){
项目。移除(位置);
}
//为适配器引用的每个项目创建新的ImageView
公共视图getView(int位置、视图转换视图、视图组父视图){
视图;
如果(convertView==null){//如果它没有被回收,初始化一些属性
LayoutInflater li=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
视图=li.充气(R.layout.list_项,空);
}否则{
视图=转换视图;
}
TextView tv=(TextView)视图;//.findViewById(R.id.text\u视图\u项);
tv.setText(items.get(position));
返回视图;
}
}
考虑为适配器使用ViewHolder模式,以避免不必要的视图膨胀。这篇文章可能会有所帮助:

定义列表项.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text_view_item"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="16sp" >
</TextView>

您只需在列表元素中定义另一个TextView即可满足您的需要。 不要忘记使用addElement(..)方法扩展适配器,该方法将元素添加到ArrayList(在本例中)中,然后使用Collections.sort(..)对其进行排序。 考虑使用一对两个字符串,这两个字符串必须实现可比性,这样你就可以根据时间排序,甚至更复杂一些。